소스 검색

Center paywall header and pricing cards while pinning trust badges above the footer.

Removes the large gap between the Upgrade to Pro title and plan cards by grouping them in a vertically centered stack and keeping footer trust badges anchored below.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 개월 전
부모
커밋
743151227a
1개의 변경된 파일55개의 추가작업 그리고 23개의 파일을 삭제
  1. 55 23
      App for Indeed/Controllers/PremiumPlansWindowController.swift

+ 55 - 23
App for Indeed/Controllers/PremiumPlansWindowController.swift

@@ -672,12 +672,16 @@ private final class PremiumPlansViewController: NSViewController {
         title.font = .systemFont(ofSize: 40, weight: .semibold)
         title.textColor = Theme.primaryText
         title.alignment = .center
+        title.lineBreakMode = .byTruncatingTail
+        title.maximumNumberOfLines = 1
         premiumTitleLabel = title
 
         let subtitle = NSTextField(labelWithString: L("Unlock unlimited access to premium tools and boost your productivity."))
         subtitle.font = .systemFont(ofSize: 14, weight: .regular)
         subtitle.textColor = Theme.secondaryText
         subtitle.alignment = .center
+        subtitle.lineBreakMode = .byWordWrapping
+        subtitle.maximumNumberOfLines = 2
         premiumSubtitleLabel = subtitle
 
         pricingCardTargets = []
@@ -696,12 +700,32 @@ private final class PremiumPlansViewController: NSViewController {
         headerStack.spacing = 10
         headerStack.alignment = .centerX
         headerStack.translatesAutoresizingMaskIntoConstraints = false
-
-        let bodyStack = NSStackView(views: [cardsRow, trustRow])
-        bodyStack.orientation = .vertical
-        bodyStack.spacing = 16
-        bodyStack.alignment = .centerX
-        bodyStack.translatesAutoresizingMaskIntoConstraints = false
+        headerStack.setContentHuggingPriority(.required, for: .vertical)
+        headerStack.setContentCompressionResistancePriority(.required, for: .vertical)
+
+        let paywallStack = NSStackView(views: [headerStack, cardsRow])
+        paywallStack.orientation = .vertical
+        paywallStack.spacing = 16
+        paywallStack.setCustomSpacing(12, after: headerStack)
+        paywallStack.alignment = .centerX
+        paywallStack.translatesAutoresizingMaskIntoConstraints = false
+        paywallStack.setContentHuggingPriority(.required, for: .vertical)
+        paywallStack.setContentCompressionResistancePriority(.required, for: .vertical)
+
+        let topFlex = NSView()
+        topFlex.translatesAutoresizingMaskIntoConstraints = false
+        topFlex.setContentHuggingPriority(.defaultLow, for: .vertical)
+        topFlex.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
+
+        let bottomFlex = NSView()
+        bottomFlex.translatesAutoresizingMaskIntoConstraints = false
+        bottomFlex.setContentHuggingPriority(.defaultLow, for: .vertical)
+        bottomFlex.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
+
+        let centeredColumn = NSStackView(views: [topFlex, paywallStack, bottomFlex])
+        centeredColumn.orientation = .vertical
+        centeredColumn.spacing = 0
+        centeredColumn.translatesAutoresizingMaskIntoConstraints = false
 
         let scrollView = NSScrollView()
         scrollView.hasVerticalScroller = true
@@ -713,23 +737,24 @@ private final class PremiumPlansViewController: NSViewController {
         let scrollDocument = NSView()
         scrollDocument.translatesAutoresizingMaskIntoConstraints = false
         scrollView.documentView = scrollDocument
-        scrollDocument.addSubview(bodyStack)
+        scrollDocument.addSubview(centeredColumn)
 
-        view.addSubview(headerStack)
         view.addSubview(scrollView)
+        view.addSubview(trustRow)
         view.addSubview(footerRow)
         view.addSubview(closeButton)
 
         let scrollClip = scrollView.contentView
         NSLayoutConstraint.activate([
-            headerStack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 24),
-            headerStack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -24),
-            headerStack.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
-
             scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 24),
             scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -24),
-            scrollView.topAnchor.constraint(equalTo: headerStack.bottomAnchor, constant: 12),
-            scrollView.bottomAnchor.constraint(equalTo: footerRow.topAnchor, constant: -12),
+            scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
+            scrollView.bottomAnchor.constraint(equalTo: trustRow.topAnchor, constant: -16),
+
+            trustRow.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 24),
+            trustRow.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -24),
+            trustRow.bottomAnchor.constraint(equalTo: footerRow.topAnchor, constant: -12),
+            trustRow.heightAnchor.constraint(equalToConstant: 72),
 
             footerRow.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 24),
             footerRow.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -24),
@@ -740,15 +765,22 @@ private final class PremiumPlansViewController: NSViewController {
             scrollDocument.trailingAnchor.constraint(equalTo: scrollClip.trailingAnchor),
             scrollDocument.topAnchor.constraint(equalTo: scrollClip.topAnchor),
             scrollDocument.widthAnchor.constraint(equalTo: scrollClip.widthAnchor),
-            scrollDocument.bottomAnchor.constraint(equalTo: bodyStack.bottomAnchor, constant: 8),
-
-            bodyStack.leadingAnchor.constraint(equalTo: scrollDocument.leadingAnchor),
-            bodyStack.trailingAnchor.constraint(equalTo: scrollDocument.trailingAnchor),
-            bodyStack.topAnchor.constraint(equalTo: scrollDocument.topAnchor, constant: 4),
-            bodyStack.widthAnchor.constraint(equalTo: scrollDocument.widthAnchor),
-
-            cardsRow.widthAnchor.constraint(equalTo: bodyStack.widthAnchor),
-            trustRow.widthAnchor.constraint(equalTo: bodyStack.widthAnchor),
+            scrollDocument.bottomAnchor.constraint(equalTo: centeredColumn.bottomAnchor),
+            scrollDocument.heightAnchor.constraint(greaterThanOrEqualTo: scrollClip.heightAnchor),
+
+            centeredColumn.leadingAnchor.constraint(equalTo: scrollDocument.leadingAnchor),
+            centeredColumn.trailingAnchor.constraint(equalTo: scrollDocument.trailingAnchor),
+            centeredColumn.topAnchor.constraint(equalTo: scrollDocument.topAnchor),
+            centeredColumn.bottomAnchor.constraint(equalTo: scrollDocument.bottomAnchor),
+            centeredColumn.widthAnchor.constraint(equalTo: scrollDocument.widthAnchor),
+
+            topFlex.heightAnchor.constraint(equalTo: bottomFlex.heightAnchor),
+
+            paywallStack.widthAnchor.constraint(equalTo: centeredColumn.widthAnchor),
+            headerStack.widthAnchor.constraint(equalTo: paywallStack.widthAnchor),
+            title.widthAnchor.constraint(equalTo: headerStack.widthAnchor),
+            subtitle.widthAnchor.constraint(equalTo: headerStack.widthAnchor),
+            cardsRow.widthAnchor.constraint(equalTo: paywallStack.widthAnchor),
 
             closeButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 14),
             closeButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -14),