Selaa lähdekoodia

Refine paywall vertical spacing and footer placement.

Balance section gaps with equal flexible spacers and adjust top/bottom insets so the screen fills more professionally with cleaner footer alignment.

Made-with: Cursor
huzaifahayat12 7 tuntia sitten
vanhempi
commit
24df0b12d6
1 muutettua tiedostoa jossa 30 lisäystä ja 6 poistoa
  1. 30 6
      classroom_app/ViewController.swift

+ 30 - 6
classroom_app/ViewController.swift

@@ -2637,7 +2637,8 @@ private extension ViewController {
2637 2637
         let contentStack = NSStackView()
2638 2638
         contentStack.translatesAutoresizingMaskIntoConstraints = false
2639 2639
         contentStack.orientation = .vertical
2640
-        contentStack.spacing = 14
2640
+        contentStack.spacing = 10
2641
+        contentStack.distribution = .fill
2641 2642
         contentStack.alignment = .centerX
2642 2643
         panel.addSubview(contentStack)
2643 2644
         let paywallLayoutWidth: CGFloat = 980
@@ -2717,6 +2718,13 @@ private extension ViewController {
2717 2718
         contentStack.addArrangedSubview(benefitsRow)
2718 2719
         benefitsRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2719 2720
 
2721
+        let midTopSpacer = NSView()
2722
+        midTopSpacer.translatesAutoresizingMaskIntoConstraints = false
2723
+        midTopSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2724
+        midTopSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2725
+        midTopSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2726
+        contentStack.addArrangedSubview(midTopSpacer)
2727
+
2720 2728
         let plansRow = NSStackView()
2721 2729
         plansRow.translatesAutoresizingMaskIntoConstraints = false
2722 2730
         plansRow.orientation = .horizontal
@@ -2768,6 +2776,13 @@ private extension ViewController {
2768 2776
         plansRow.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
2769 2777
         updatePaywallPlanSelection()
2770 2778
 
2779
+        let midBottomSpacer = NSView()
2780
+        midBottomSpacer.translatesAutoresizingMaskIntoConstraints = false
2781
+        midBottomSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2782
+        midBottomSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2783
+        midBottomSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2784
+        contentStack.addArrangedSubview(midBottomSpacer)
2785
+
2771 2786
         let offer = textLabel(paywallOfferText(for: selectedPremiumPlan), font: NSFont.systemFont(ofSize: 13, weight: .semibold), color: palette.textPrimary)
2772 2787
         offer.alignment = .center
2773 2788
         paywallOfferLabel = offer
@@ -2822,6 +2837,15 @@ private extension ViewController {
2822 2837
             secure.bottomAnchor.constraint(equalTo: secureWrap.bottomAnchor, constant: -4)
2823 2838
         ])
2824 2839
 
2840
+        let footerTopSpacer = NSView()
2841
+        footerTopSpacer.translatesAutoresizingMaskIntoConstraints = false
2842
+        contentStack.addArrangedSubview(footerTopSpacer)
2843
+        footerTopSpacer.setContentHuggingPriority(.defaultLow, for: .vertical)
2844
+        footerTopSpacer.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
2845
+        footerTopSpacer.heightAnchor.constraint(greaterThanOrEqualToConstant: 8).isActive = true
2846
+        midTopSpacer.heightAnchor.constraint(equalTo: midBottomSpacer.heightAnchor).isActive = true
2847
+        midBottomSpacer.heightAnchor.constraint(equalTo: footerTopSpacer.heightAnchor).isActive = true
2848
+
2825 2849
         let footer = paywallFooterLinks()
2826 2850
         contentStack.addArrangedSubview(footer)
2827 2851
         footer.widthAnchor.constraint(equalTo: contentStack.widthAnchor).isActive = true
@@ -2829,8 +2853,8 @@ private extension ViewController {
2829 2853
         NSLayoutConstraint.activate([
2830 2854
             contentStack.centerXAnchor.constraint(equalTo: panel.centerXAnchor),
2831 2855
             contentStack.widthAnchor.constraint(equalToConstant: paywallLayoutWidth),
2832
-            contentStack.topAnchor.constraint(equalTo: panel.topAnchor, constant: 20),
2833
-            contentStack.bottomAnchor.constraint(lessThanOrEqualTo: panel.bottomAnchor, constant: -16)
2856
+            contentStack.topAnchor.constraint(equalTo: panel.topAnchor, constant: 30),
2857
+            contentStack.bottomAnchor.constraint(equalTo: panel.bottomAnchor, constant: -20)
2834 2858
         ])
2835 2859
 
2836 2860
         refreshPaywallStoreUI()
@@ -2942,7 +2966,7 @@ private extension ViewController {
2942 2966
     func paywallFooterLinks() -> NSView {
2943 2967
         let wrap = NSView()
2944 2968
         wrap.translatesAutoresizingMaskIntoConstraints = false
2945
-        wrap.heightAnchor.constraint(equalToConstant: 34).isActive = true
2969
+        wrap.heightAnchor.constraint(equalToConstant: 56).isActive = true
2946 2970
 
2947 2971
         let row = NSStackView()
2948 2972
         row.translatesAutoresizingMaskIntoConstraints = false
@@ -2959,8 +2983,8 @@ private extension ViewController {
2959 2983
         NSLayoutConstraint.activate([
2960 2984
             row.leadingAnchor.constraint(equalTo: wrap.leadingAnchor),
2961 2985
             row.trailingAnchor.constraint(equalTo: wrap.trailingAnchor),
2962
-            row.topAnchor.constraint(equalTo: wrap.topAnchor),
2963
-            row.bottomAnchor.constraint(equalTo: wrap.bottomAnchor)
2986
+            row.topAnchor.constraint(greaterThanOrEqualTo: wrap.topAnchor),
2987
+            row.bottomAnchor.constraint(equalTo: wrap.bottomAnchor, constant: -4)
2964 2988
         ])
2965 2989
 
2966 2990
         return wrap