Bladeren bron

Fix Profiles list layout and scroll alignment.

Place profile rows directly under the title and description, and move the empty-state copy and Add button into a footer below the list. Use a flipped scroll document view so short content aligns to the top of the clip view instead of leaving a large gap above it on macOS.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 2 maanden geleden
bovenliggende
commit
e6c3ceeed5
1 gewijzigde bestanden met toevoegingen van 32 en 15 verwijderingen
  1. 32 15
      App for Indeed/Views/ProfilesListPageView.swift

+ 32 - 15
App for Indeed/Views/ProfilesListPageView.swift

@@ -16,6 +16,11 @@ private enum ProfilesListPalette {
     static let destructive = NSColor(srgbRed: 220 / 255, green: 38 / 255, blue: 38 / 255, alpha: 1)
 }
 
+/// Document view for the profiles `NSScrollView`; flipped coordinates keep short content aligned to the top of the clip (avoids a large empty band above the content on macOS).
+private final class ProfilesListDocumentView: NSView {
+    override var isFlipped: Bool { true }
+}
+
 /// Hub for saved job profiles: list, add, edit (opens editor elsewhere), delete.
 final class ProfilesListPageView: NSView {
     var onAddProfile: (() -> Void)?
@@ -23,7 +28,7 @@ final class ProfilesListPageView: NSView {
     var onDeleteProfile: ((UUID) -> Void)?
 
     private let scrollView = NSScrollView()
-    private let documentView = NSView()
+    private let documentView = ProfilesListDocumentView()
     private let contentStack = NSStackView()
     private let emptyStateLabel = NSTextField(wrappingLabelWithString: "")
     private let addButton = ProfilesPrimaryButton(title: "Add new profile  →", target: nil, action: nil)
@@ -85,12 +90,18 @@ final class ProfilesListPageView: NSView {
         addButton.action = #selector(didTapAdd)
         addButton.translatesAutoresizingMaskIntoConstraints = false
 
-        let headerStack = NSStackView(views: [title, subtitle, emptyStateLabel, addButton])
-        headerStack.orientation = .vertical
-        headerStack.alignment = .leading
-        headerStack.spacing = 10
-        headerStack.translatesAutoresizingMaskIntoConstraints = false
-        headerStack.setCustomSpacing(16, after: subtitle)
+        let titleSubtitleStack = NSStackView(views: [title, subtitle])
+        titleSubtitleStack.orientation = .vertical
+        titleSubtitleStack.alignment = .leading
+        titleSubtitleStack.spacing = 10
+        titleSubtitleStack.translatesAutoresizingMaskIntoConstraints = false
+
+        let footerStack = NSStackView(views: [emptyStateLabel, addButton])
+        footerStack.orientation = .vertical
+        footerStack.alignment = .leading
+        footerStack.spacing = 10
+        footerStack.translatesAutoresizingMaskIntoConstraints = false
+        footerStack.setCustomSpacing(16, after: emptyStateLabel)
 
         contentStack.orientation = .vertical
         contentStack.alignment = .leading
@@ -98,8 +109,9 @@ final class ProfilesListPageView: NSView {
         contentStack.translatesAutoresizingMaskIntoConstraints = false
 
         documentView.translatesAutoresizingMaskIntoConstraints = false
-        documentView.addSubview(headerStack)
+        documentView.addSubview(titleSubtitleStack)
         documentView.addSubview(contentStack)
+        documentView.addSubview(footerStack)
 
         scrollView.translatesAutoresizingMaskIntoConstraints = false
         scrollView.drawsBackground = false
@@ -120,18 +132,23 @@ final class ProfilesListPageView: NSView {
             documentView.leftAnchor.constraint(equalTo: scrollView.contentView.leftAnchor),
             documentView.rightAnchor.constraint(equalTo: scrollView.contentView.rightAnchor),
             documentView.topAnchor.constraint(equalTo: scrollView.contentView.topAnchor),
-            documentView.bottomAnchor.constraint(equalTo: contentStack.bottomAnchor, constant: 32),
+            documentView.bottomAnchor.constraint(equalTo: footerStack.bottomAnchor, constant: 32),
 
-            headerStack.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: 32),
-            headerStack.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -32),
-            headerStack.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 24),
+            titleSubtitleStack.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: 32),
+            titleSubtitleStack.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -32),
+            titleSubtitleStack.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 24),
 
             contentStack.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: 32),
             contentStack.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -32),
-            contentStack.topAnchor.constraint(equalTo: headerStack.bottomAnchor, constant: 24),
+            contentStack.topAnchor.constraint(equalTo: titleSubtitleStack.bottomAnchor, constant: 24),
+
+            footerStack.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: 32),
+            footerStack.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -32),
+            footerStack.topAnchor.constraint(equalTo: contentStack.bottomAnchor, constant: 24),
 
-            headerStack.widthAnchor.constraint(equalTo: documentView.widthAnchor, constant: -64),
-            contentStack.widthAnchor.constraint(equalTo: documentView.widthAnchor, constant: -64)
+            titleSubtitleStack.widthAnchor.constraint(equalTo: documentView.widthAnchor, constant: -64),
+            contentStack.widthAnchor.constraint(equalTo: documentView.widthAnchor, constant: -64),
+            footerStack.widthAnchor.constraint(equalTo: documentView.widthAnchor, constant: -64)
         ])
 
         reloadFromStore()