Bladeren bron

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 maand geleden
bovenliggende
commit
743151227a
1 gewijzigde bestanden met toevoegingen van 55 en 23 verwijderingen
  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),