Explorar el Código

Add CV Maker template gallery page

Builds out the CV Maker sidebar destination with a light-theme template
gallery: header, Design-Based vs Profession-Based pill toggle, family
chips with live counts, a 4-column thumbnail grid with hover Preview
overlay, and a sticky "Use Template & Select Profile" CTA. Catalog ships
30 templates (six Minimal variants matching the reference layout plus
six per Professional/Modern/Creative/Executive family) with varied
headline, accent, sidebar, and section-label styles driven by a single
mini-preview renderer. Sidebar routing now hides the generic placeholder
when CV Maker is selected and shows the new container alongside Saved
Jobs and Settings.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 hace 3 semanas
padre
commit
a3fcfa3d02
Se han modificado 2 ficheros con 1615 adiciones y 3 borrados
  1. 1578 0
      App for Indeed/Views/CVMakerPageView.swift
  2. 37 3
      App for Indeed/Views/DashboardView.swift

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1578 - 0
App for Indeed/Views/CVMakerPageView.swift


+ 37 - 3
App for Indeed/Views/DashboardView.swift

@@ -117,6 +117,10 @@ final class DashboardView: NSView, NSTextFieldDelegate {
117
     private let savedJobsStack = NSStackView()
117
     private let savedJobsStack = NSStackView()
118
     private let settingsPageContainer = NSView()
118
     private let settingsPageContainer = NSView()
119
     private let themeControl = NSSegmentedControl()
119
     private let themeControl = NSSegmentedControl()
120
+    private let cvMakerPageContainer = NSView()
121
+    private lazy var cvMakerPageView: CVMakerPageView = {
122
+        CVMakerPageView()
123
+    }()
120
 
124
 
121
     private var currentSidebarItems: [SidebarItem] = []
125
     private var currentSidebarItems: [SidebarItem] = []
122
     private var selectedSidebarIndex: Int = 0
126
     private var selectedSidebarIndex: Int = 0
@@ -1073,9 +1077,11 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1073
         nonHomeGenericContainer.translatesAutoresizingMaskIntoConstraints = false
1077
         nonHomeGenericContainer.translatesAutoresizingMaskIntoConstraints = false
1074
         savedJobsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1078
         savedJobsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1075
         settingsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1079
         settingsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1080
+        cvMakerPageContainer.translatesAutoresizingMaskIntoConstraints = false
1076
         nonHomeHost.addSubview(nonHomeGenericContainer)
1081
         nonHomeHost.addSubview(nonHomeGenericContainer)
1077
         nonHomeHost.addSubview(savedJobsPageContainer)
1082
         nonHomeHost.addSubview(savedJobsPageContainer)
1078
         nonHomeHost.addSubview(settingsPageContainer)
1083
         nonHomeHost.addSubview(settingsPageContainer)
1084
+        nonHomeHost.addSubview(cvMakerPageContainer)
1079
 
1085
 
1080
         NSLayoutConstraint.activate([
1086
         NSLayoutConstraint.activate([
1081
             nonHomeGenericContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
1087
             nonHomeGenericContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
@@ -1091,7 +1097,12 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1091
             settingsPageContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
1097
             settingsPageContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
1092
             settingsPageContainer.trailingAnchor.constraint(equalTo: nonHomeHost.trailingAnchor),
1098
             settingsPageContainer.trailingAnchor.constraint(equalTo: nonHomeHost.trailingAnchor),
1093
             settingsPageContainer.topAnchor.constraint(equalTo: nonHomeHost.topAnchor),
1099
             settingsPageContainer.topAnchor.constraint(equalTo: nonHomeHost.topAnchor),
1094
-            settingsPageContainer.bottomAnchor.constraint(equalTo: nonHomeHost.bottomAnchor)
1100
+            settingsPageContainer.bottomAnchor.constraint(equalTo: nonHomeHost.bottomAnchor),
1101
+
1102
+            cvMakerPageContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
1103
+            cvMakerPageContainer.trailingAnchor.constraint(equalTo: nonHomeHost.trailingAnchor),
1104
+            cvMakerPageContainer.topAnchor.constraint(equalTo: nonHomeHost.topAnchor),
1105
+            cvMakerPageContainer.bottomAnchor.constraint(equalTo: nonHomeHost.bottomAnchor)
1095
         ])
1106
         ])
1096
 
1107
 
1097
         nonHomeTitleLabel.font = .systemFont(ofSize: 22, weight: .bold)
1108
         nonHomeTitleLabel.font = .systemFont(ofSize: 22, weight: .bold)
@@ -1185,6 +1196,22 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1185
         ])
1196
         ])
1186
 
1197
 
1187
         configureSettingsPage()
1198
         configureSettingsPage()
1199
+        configureCVMakerPage()
1200
+    }
1201
+
1202
+    private func configureCVMakerPage() {
1203
+        cvMakerPageContainer.wantsLayer = true
1204
+        cvMakerPageContainer.layer?.backgroundColor = Theme.mainHostBackground.cgColor
1205
+        cvMakerPageContainer.isHidden = true
1206
+
1207
+        cvMakerPageView.translatesAutoresizingMaskIntoConstraints = false
1208
+        cvMakerPageContainer.addSubview(cvMakerPageView)
1209
+        NSLayoutConstraint.activate([
1210
+            cvMakerPageView.leadingAnchor.constraint(equalTo: cvMakerPageContainer.leadingAnchor),
1211
+            cvMakerPageView.trailingAnchor.constraint(equalTo: cvMakerPageContainer.trailingAnchor),
1212
+            cvMakerPageView.topAnchor.constraint(equalTo: cvMakerPageContainer.topAnchor),
1213
+            cvMakerPageView.bottomAnchor.constraint(equalTo: cvMakerPageContainer.bottomAnchor)
1214
+        ])
1188
     }
1215
     }
1189
 
1216
 
1190
     private func configureSettingsPage() {
1217
     private func configureSettingsPage() {
@@ -1415,19 +1442,26 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1415
         return currentSidebarItems[index].title == "Settings"
1442
         return currentSidebarItems[index].title == "Settings"
1416
     }
1443
     }
1417
 
1444
 
1445
+    private func isCVMakerSidebarIndex(_ index: Int) -> Bool {
1446
+        guard index >= 0, index < currentSidebarItems.count else { return false }
1447
+        return currentSidebarItems[index].title == "CV Maker"
1448
+    }
1449
+
1418
     private func updateMainContentVisibility() {
1450
     private func updateMainContentVisibility() {
1419
         let home = isHomeSidebarIndex(selectedSidebarIndex)
1451
         let home = isHomeSidebarIndex(selectedSidebarIndex)
1420
         let savedJobs = isSavedJobsSidebarIndex(selectedSidebarIndex)
1452
         let savedJobs = isSavedJobsSidebarIndex(selectedSidebarIndex)
1421
         let settings = isSettingsSidebarIndex(selectedSidebarIndex)
1453
         let settings = isSettingsSidebarIndex(selectedSidebarIndex)
1454
+        let cvMaker = isCVMakerSidebarIndex(selectedSidebarIndex)
1422
         mainOverlay.isHidden = !home
1455
         mainOverlay.isHidden = !home
1423
         nonHomeHost.isHidden = home
1456
         nonHomeHost.isHidden = home
1424
-        nonHomeGenericContainer.isHidden = savedJobs || settings
1457
+        nonHomeGenericContainer.isHidden = savedJobs || settings || cvMaker
1425
         savedJobsPageContainer.isHidden = !savedJobs
1458
         savedJobsPageContainer.isHidden = !savedJobs
1426
         settingsPageContainer.isHidden = !settings
1459
         settingsPageContainer.isHidden = !settings
1460
+        cvMakerPageContainer.isHidden = !cvMaker
1427
         if !home, selectedSidebarIndex < currentSidebarItems.count {
1461
         if !home, selectedSidebarIndex < currentSidebarItems.count {
1428
             if savedJobs {
1462
             if savedJobs {
1429
                 reloadSavedJobsListings()
1463
                 reloadSavedJobsListings()
1430
-            } else if settings {
1464
+            } else if settings || cvMaker {
1431
                 window?.makeFirstResponder(nil)
1465
                 window?.makeFirstResponder(nil)
1432
             } else {
1466
             } else {
1433
                 nonHomeTitleLabel.stringValue = currentSidebarItems[selectedSidebarIndex].title
1467
                 nonHomeTitleLabel.stringValue = currentSidebarItems[selectedSidebarIndex].title