Преглед изворни кода

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 пре 3 недеља
родитељ
комит
a3fcfa3d02
2 измењених фајлова са 1615 додато и 3 уклоњено
  1. 1578 0
      App for Indeed/Views/CVMakerPageView.swift
  2. 37 3
      App for Indeed/Views/DashboardView.swift

Разлика између датотеке није приказан због своје велике величине
+ 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 117
     private let savedJobsStack = NSStackView()
118 118
     private let settingsPageContainer = NSView()
119 119
     private let themeControl = NSSegmentedControl()
120
+    private let cvMakerPageContainer = NSView()
121
+    private lazy var cvMakerPageView: CVMakerPageView = {
122
+        CVMakerPageView()
123
+    }()
120 124
 
121 125
     private var currentSidebarItems: [SidebarItem] = []
122 126
     private var selectedSidebarIndex: Int = 0
@@ -1073,9 +1077,11 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1073 1077
         nonHomeGenericContainer.translatesAutoresizingMaskIntoConstraints = false
1074 1078
         savedJobsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1075 1079
         settingsPageContainer.translatesAutoresizingMaskIntoConstraints = false
1080
+        cvMakerPageContainer.translatesAutoresizingMaskIntoConstraints = false
1076 1081
         nonHomeHost.addSubview(nonHomeGenericContainer)
1077 1082
         nonHomeHost.addSubview(savedJobsPageContainer)
1078 1083
         nonHomeHost.addSubview(settingsPageContainer)
1084
+        nonHomeHost.addSubview(cvMakerPageContainer)
1079 1085
 
1080 1086
         NSLayoutConstraint.activate([
1081 1087
             nonHomeGenericContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
@@ -1091,7 +1097,12 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1091 1097
             settingsPageContainer.leadingAnchor.constraint(equalTo: nonHomeHost.leadingAnchor),
1092 1098
             settingsPageContainer.trailingAnchor.constraint(equalTo: nonHomeHost.trailingAnchor),
1093 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 1108
         nonHomeTitleLabel.font = .systemFont(ofSize: 22, weight: .bold)
@@ -1185,6 +1196,22 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1185 1196
         ])
1186 1197
 
1187 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 1217
     private func configureSettingsPage() {
@@ -1415,19 +1442,26 @@ final class DashboardView: NSView, NSTextFieldDelegate {
1415 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 1450
     private func updateMainContentVisibility() {
1419 1451
         let home = isHomeSidebarIndex(selectedSidebarIndex)
1420 1452
         let savedJobs = isSavedJobsSidebarIndex(selectedSidebarIndex)
1421 1453
         let settings = isSettingsSidebarIndex(selectedSidebarIndex)
1454
+        let cvMaker = isCVMakerSidebarIndex(selectedSidebarIndex)
1422 1455
         mainOverlay.isHidden = !home
1423 1456
         nonHomeHost.isHidden = home
1424
-        nonHomeGenericContainer.isHidden = savedJobs || settings
1457
+        nonHomeGenericContainer.isHidden = savedJobs || settings || cvMaker
1425 1458
         savedJobsPageContainer.isHidden = !savedJobs
1426 1459
         settingsPageContainer.isHidden = !settings
1460
+        cvMakerPageContainer.isHidden = !cvMaker
1427 1461
         if !home, selectedSidebarIndex < currentSidebarItems.count {
1428 1462
             if savedJobs {
1429 1463
                 reloadSavedJobsListings()
1430
-            } else if settings {
1464
+            } else if settings || cvMaker {
1431 1465
                 window?.makeFirstResponder(nil)
1432 1466
             } else {
1433 1467
                 nonHomeTitleLabel.stringValue = currentSidebarItems[selectedSidebarIndex].title