Ver código fonte

Add bordered content panel to home screen and refine header layout.

Introduce a shared ContentPanelView for consistent card-style borders on home and settings, with tuned spacing for the title and scroll content.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 mês atrás
pai
commit
8ee51b05ee

+ 5 - 0
smart_printer/AppTheme.swift

@@ -29,6 +29,11 @@ enum AppTheme {
     static let cornerRadius: CGFloat = 14
     static let cardCornerRadius: CGFloat = 20
     static let featureCardCornerRadius: CGFloat = 16
+    static let contentPanelCornerRadius: CGFloat = 24
+    static let contentPanelInset: CGFloat = 16
+    static let headerTopInset: CGFloat = 14
+    static let headerHeight: CGFloat = 32
+    static let contentBelowHeaderGap: CGFloat = 2
 
     private static var isDark: Bool { AppSettings.darkModeEnabled }
 

+ 1 - 22
smart_printer/SettingsView.swift

@@ -29,7 +29,7 @@ final class SettingsView: NSView, AppearanceRefreshable {
         let document = FlippedSettingsDocumentView()
         document.translatesAutoresizingMaskIntoConstraints = false
 
-        let panel = SettingsPanelView()
+        let panel = ContentPanelView(cornerRadius: 22)
         panel.translatesAutoresizingMaskIntoConstraints = false
 
         let stack = NSStackView()
@@ -137,27 +137,6 @@ final class SettingsView: NSView, AppearanceRefreshable {
     }
 }
 
-// MARK: - Panel
-
-private final class SettingsPanelView: NSView, AppearanceRefreshable {
-    init() {
-        super.init(frame: .zero)
-        wantsLayer = true
-        layer?.cornerRadius = 22
-        layer?.borderWidth = 1.5
-        applyCardShadow()
-        refreshAppearance()
-    }
-
-    func refreshAppearance() {
-        layer?.backgroundColor = AppTheme.cardBackground.cgColor
-        layer?.borderColor = AppTheme.paywallBorder.cgColor
-    }
-
-    @available(*, unavailable)
-    required init?(coder: NSCoder) { nil }
-}
-
 private final class SettingsGroupCard: NSView, AppearanceRefreshable {
     private let stack = NSStackView()
 

+ 21 - 0
smart_printer/UIComponents.swift

@@ -1,5 +1,26 @@
 import Cocoa
 
+// MARK: - Content Panel
+
+final class ContentPanelView: NSView, AppearanceRefreshable {
+    init(cornerRadius: CGFloat = AppTheme.contentPanelCornerRadius) {
+        super.init(frame: .zero)
+        wantsLayer = true
+        layer?.cornerRadius = cornerRadius
+        layer?.borderWidth = 1.5
+        applyCardShadow()
+        refreshAppearance()
+    }
+
+    @available(*, unavailable)
+    required init?(coder: NSCoder) { nil }
+
+    func refreshAppearance() {
+        layer?.backgroundColor = AppTheme.cardBackground.cgColor
+        layer?.borderColor = AppTheme.paywallBorder.cgColor
+    }
+}
+
 // MARK: - Gradient Card View
 
 final class GradientCardView: NSView {

+ 24 - 11
smart_printer/ViewController.swift

@@ -91,8 +91,8 @@ class ViewController: NSViewController {
 
         view.addSubview(sidebar)
         view.addSubview(mainContentView)
-        mainContentView.addSubview(headerView)
         mainContentView.addSubview(contentContainer)
+        mainContentView.addSubview(headerView, positioned: .above, relativeTo: contentContainer)
 
         sidebar.onDestinationSelected = { [weak self] destination in
             self?.showDestination(destination)
@@ -110,8 +110,8 @@ class ViewController: NSViewController {
 
             headerView.leadingAnchor.constraint(equalTo: mainContentView.leadingAnchor),
             headerView.trailingAnchor.constraint(equalTo: mainContentView.trailingAnchor),
-            headerView.topAnchor.constraint(equalTo: mainContentView.topAnchor, constant: 16),
-            headerView.heightAnchor.constraint(equalToConstant: 44),
+            headerView.topAnchor.constraint(equalTo: mainContentView.topAnchor, constant: AppTheme.headerTopInset),
+            headerView.heightAnchor.constraint(equalToConstant: AppTheme.headerHeight),
 
             contentContainer.leadingAnchor.constraint(equalTo: mainContentView.leadingAnchor),
             contentContainer.trailingAnchor.constraint(equalTo: mainContentView.trailingAnchor),
@@ -123,7 +123,10 @@ class ViewController: NSViewController {
         pinContentView(scanAndHomeContentView)
         pinContentView(settingsContentView)
 
-        contentTopBelowHeader = contentContainer.topAnchor.constraint(equalTo: headerView.bottomAnchor, constant: 8)
+        contentTopBelowHeader = contentContainer.topAnchor.constraint(
+            equalTo: headerView.bottomAnchor,
+            constant: AppTheme.contentBelowHeaderGap
+        )
         contentTopBelowWindow = contentContainer.topAnchor.constraint(equalTo: mainContentView.topAnchor, constant: 12)
         contentTopBelowHeader.isActive = true
 
@@ -189,14 +192,24 @@ class ViewController: NSViewController {
         let container = NSView()
         container.translatesAutoresizingMaskIntoConstraints = false
 
+        let panel = ContentPanelView()
+        panel.translatesAutoresizingMaskIntoConstraints = false
+
         let scrollView = makeScrollView()
-        container.addSubview(scrollView)
+        panel.addSubview(scrollView)
+        container.addSubview(panel)
 
+        let inset = AppTheme.contentPanelInset
         NSLayoutConstraint.activate([
-            scrollView.leadingAnchor.constraint(equalTo: container.leadingAnchor),
-            scrollView.trailingAnchor.constraint(equalTo: container.trailingAnchor),
-            scrollView.topAnchor.constraint(equalTo: container.topAnchor),
-            scrollView.bottomAnchor.constraint(equalTo: container.bottomAnchor),
+            panel.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: inset),
+            panel.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -inset),
+            panel.topAnchor.constraint(equalTo: container.topAnchor),
+            panel.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: -inset),
+
+            scrollView.leadingAnchor.constraint(equalTo: panel.leadingAnchor),
+            scrollView.trailingAnchor.constraint(equalTo: panel.trailingAnchor),
+            scrollView.topAnchor.constraint(equalTo: panel.topAnchor),
+            scrollView.bottomAnchor.constraint(equalTo: panel.bottomAnchor),
         ])
 
         return container
@@ -286,7 +299,7 @@ class ViewController: NSViewController {
 
         NSLayoutConstraint.activate([
             titleLabel.centerXAnchor.constraint(equalTo: header.centerXAnchor),
-            titleLabel.centerYAnchor.constraint(equalTo: header.centerYAnchor),
+            titleLabel.topAnchor.constraint(equalTo: header.topAnchor, constant: 2),
         ])
 
         return header
@@ -345,7 +358,7 @@ class ViewController: NSViewController {
 
             quickStartSection.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
             quickStartSection.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
-            quickStartSection.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 8),
+            quickStartSection.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 20),
 
             createPrintSection.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
             createPrintSection.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),