Ariver
2026-06-27 7a5b90ce9aff96fa46f356c8feb66a4a02e8f218
src/Apptag/AppGridCollectionView.swift
@@ -1777,7 +1777,7 @@
    private struct LayoutItem {
        let index: Int
        let frame: NSRect
        var frame: NSRect
    }
    private struct LayoutPlan {
@@ -1913,7 +1913,15 @@
        let columnWidth = floor((availableWidth - gap * CGFloat(columnCount - 1)) / CGFloat(columnCount))
        var columnHeights = Array(repeating: outerPadding, count: columnCount)
        var items: [LayoutItem] = []
        let bottomPinnedGroups = groups.enumerated().filter { $0.element.containerID == AppContainerID.appleBuiltIn }
        var lastItemIndexForColumn = Array<Int?>(repeating: nil, count: columnCount)
        let bottomPinnedGroups = groups.enumerated()
            .filter { bottomPinnedPriority(for: $0.element.containerID) != nil }
            .sorted {
                let lhsPriority = bottomPinnedPriority(for: $0.element.containerID) ?? Int.max
                let rhsPriority = bottomPinnedPriority(for: $1.element.containerID) ?? Int.max
                if lhsPriority != rhsPriority { return lhsPriority < rhsPriority }
                return $0.offset < $1.offset
            }
        let bottomPinnedIndexes = Set(bottomPinnedGroups.map { $0.offset })
        for (index, group) in groups.enumerated() {
@@ -1933,10 +1941,21 @@
                    frame: NSRect(x: x, y: y, width: columnWidth, height: height)
                )
            )
            lastItemIndexForColumn[columnIndex] = items.count - 1
            columnHeights[columnIndex] = y + height + gap
        }
        var contentBottom = columnHeights.max() ?? outerPadding
        if !bottomPinnedGroups.isEmpty {
            let alignedBottom = max(outerPadding, contentBottom - gap)
            for itemIndex in lastItemIndexForColumn.compactMap({ $0 }) {
                let currentFrame = items[itemIndex].frame
                let alignedHeight = alignedBottom - currentFrame.minY
                if alignedHeight > currentFrame.height {
                    items[itemIndex].frame.size.height = alignedHeight
                }
            }
        }
        for (index, group) in bottomPinnedGroups {
            let y = max(outerPadding, contentBottom)
            let height = AppGridCollectionMetrics.cardHeight(
@@ -1961,6 +1980,17 @@
        )
    }
    private static func bottomPinnedPriority(for containerID: String) -> Int? {
        switch containerID {
        case AppContainerID.uncategorized:
            return 0
        case AppContainerID.appleBuiltIn:
            return 1
        default:
            return nil
        }
    }
    private struct RowItem {
        let index: Int
        let width: CGFloat