Ariver
2026-06-13 a80a5b8edd2fc2958252c127ee378112f219841f
Move usage tip dots below controls
2 files modified
33 ■■■■■ changed files
src/Apptag/AppGridCollectionView.swift 23 ●●●● patch | view | raw | blame | history
src/Scripts/usage_tips_qa.sh 10 ●●●●● patch | view | raw | blame | history
src/Apptag/AppGridCollectionView.swift
@@ -944,8 +944,7 @@
        let iconSize: CGFloat = 24
        let iconTextGap: CGFloat = 10
        let titleDetailGap: CGFloat = 22
        let detailDotsGap: CGFloat = 24
        let dotsButtonGap: CGFloat = 16
        let detailControlsGap: CGFloat = 24
        let buttonGap: CGFloat = 6
        let buttonSize: CGFloat = 48
        let dotsWidth = dotsView.preferredWidth
@@ -961,7 +960,7 @@
        let titleX = iconView.frame.maxX + iconTextGap
        let buttonsWidth = buttonSize * 2 + buttonGap
        let trailingWidth = paddingRight + buttonsWidth + dotsButtonGap + dotsWidth + detailDotsGap
        let trailingWidth = paddingRight + buttonsWidth + detailControlsGap
        let availableTextWidth = max(1, visualFrame.maxX - titleX - titleDetailGap - trailingWidth)
        let minimumReadableDetailWidth: CGFloat = 220
        let titleWidth: CGFloat
@@ -980,28 +979,29 @@
            height: visualFrame.height
        )
        let buttonY = centerY - buttonSize / 2
        let buttonY = visualFrame.minY + 10
        let buttonsGroupMinX = visualFrame.maxX - paddingRight - buttonsWidth
        nextButton.frame = NSRect(
            x: visualFrame.maxX - paddingRight - buttonSize,
            x: buttonsGroupMinX + buttonSize + buttonGap,
            y: buttonY,
            width: buttonSize,
            height: buttonSize
        )
        previousButton.frame = NSRect(
            x: nextButton.frame.minX - buttonGap - buttonSize,
            x: buttonsGroupMinX,
            y: buttonY,
            width: buttonSize,
            height: buttonSize
        )
        dotsView.frame = NSRect(
            x: previousButton.frame.minX - dotsButtonGap - dotsWidth,
            y: centerY - 5,
            x: buttonsGroupMinX + (buttonsWidth - dotsWidth) / 2,
            y: previousButton.frame.maxY + 6,
            width: dotsWidth,
            height: 10
        )
        let detailX = titleLabel.frame.maxX + titleDetailGap
        let detailRight = dotsView.frame.minX - detailDotsGap
        let detailRight = previousButton.frame.minX - detailControlsGap
        detailScrollView.frame = NSRect(
            x: detailX,
            y: visualFrame.minY,
@@ -1048,11 +1048,10 @@
    func preferredWidth(maxAvailableWidth: CGFloat) -> CGFloat {
        let padding: CGFloat = 22 + 16
        let fixedWidth: CGFloat = 24 + 10 + 22 + 24 + 16 + 48 + 6 + 48
        let dotsWidth = dotsView.preferredWidth
        let fixedWidth: CGFloat = 24 + 10 + 22 + 24 + 48 + 6 + 48
        let titleWidth = ceil(titleLabel.attributedStringValue.size().width)
        let detailWidth = ceil(detailLabel.attributedStringValue.size().width)
        let contentWidth = padding + fixedWidth + dotsWidth + titleWidth + detailWidth
        let contentWidth = padding + fixedWidth + titleWidth + detailWidth
        let preferredWidth = max(AppGridUsageTipsMetrics.minWidth, contentWidth)
        return min(maxAvailableWidth, preferredWidth)
    }
src/Scripts/usage_tips_qa.sh
@@ -130,6 +130,16 @@
    "Usage tips layout must allocate text from actual available AppGrid width",
)
require(
    r"dotsView\.frame\s*=\s*NSRect\s*\((?P<body>.*?)x\s*:\s*buttonsGroupMinX\s*\+\s*\(buttonsWidth\s*-\s*dotsWidth\)\s*/\s*2(?P<body2>.*?)y\s*:\s*previousButton\.frame\.maxY\s*\+\s*6",
    app_grid,
    "Usage tips page dots must sit centered below the previous/next arrow buttons",
)
require(
    r"detailRight\s*=\s*previousButton\.frame\.minX\s*-\s*detailControlsGap",
    app_grid,
    "Usage tips detail text must stop before the arrow controls when dots move below them",
)
require(
    r"return\s+min\s*\(\s*maxAvailableWidth\s*,\s*preferredWidth\s*\)",
    app_grid,
    "Usage tips preferred width must expand up to available AppGrid width for long localizations",