Prechádzať zdrojové kódy

Keep results-page headers fixed while scrolling content.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 mesiac pred
rodič
commit
cd0be7eed6

+ 11 - 9
gramora/Views/JournalFinderView.swift

@@ -110,23 +110,25 @@ struct JournalFinderView: View {
         topPadding: CGFloat,
         bottomPadding: CGFloat
     ) -> some View {
-        ScrollView(.vertical, showsIndicators: false) {
-            VStack(alignment: .leading, spacing: 0) {
-                resultsHeader(result: result)
-                    .padding(.bottom, 24)
+        VStack(alignment: .leading, spacing: 0) {
+            resultsHeader(result: result)
+                .padding(.bottom, 24)
 
+            ScrollView(.vertical, showsIndicators: false) {
                 LazyVStack(spacing: 16) {
                     ForEach(Array(result.recommendations.enumerated()), id: \.element.id) { index, journal in
                         journalCard(journal, rank: index + 1)
                     }
                 }
+                .padding(.bottom, bottomPadding)
             }
-            .frame(maxWidth: 1200, alignment: .topLeading)
-            .frame(maxWidth: .infinity, alignment: .topLeading)
-            .padding(.horizontal, horizontalPadding)
-            .padding(.top, topPadding)
-            .padding(.bottom, bottomPadding)
+            .frame(maxWidth: .infinity, maxHeight: .infinity)
         }
+        .frame(maxWidth: 1200, maxHeight: .infinity, alignment: .topLeading)
+        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
+        .padding(.horizontal, horizontalPadding)
+        .padding(.top, topPadding)
+        .padding(.bottom, bottomPadding)
     }
 
     // MARK: - Header

+ 29 - 25
gramora/Views/ParaphrasingView.swift

@@ -40,35 +40,39 @@ struct ParaphrasingView: View {
                     .padding(.top, AppTheme.brandLabelTopInset)
                     .padding(.bottom, dynamicBottomPadding)
                 } else {
-                    ScrollView(.vertical, showsIndicators: false) {
-                        VStack(alignment: .leading, spacing: 0) {
-                            header
-                                .padding(.bottom, 24)
-
-                            contentCard
-                                .padding(.bottom, 24)
-
-                            outputCard
-                                .padding(.bottom, 24)
-
-                            if let errorMessage = viewModel.errorMessage {
-                                Text(errorMessage)
-                                    .font(.system(size: 14))
-                                    .foregroundStyle(.red)
-                                    .padding(.bottom, 12)
-                            }
+                    VStack(alignment: .leading, spacing: 0) {
+                        header
+                            .padding(.bottom, 24)
 
-                            GradientButton(title: viewModel.isParaphrasing ? "Paraphrasing..." : "Paraphrase") {
-                                viewModel.paraphrase()
+                        ScrollView(.vertical, showsIndicators: false) {
+                            VStack(alignment: .leading, spacing: 0) {
+                                contentCard
+                                    .padding(.bottom, 24)
+
+                                outputCard
+                                    .padding(.bottom, 24)
+
+                                if let errorMessage = viewModel.errorMessage {
+                                    Text(errorMessage)
+                                        .font(.system(size: 14))
+                                        .foregroundStyle(.red)
+                                        .padding(.bottom, 12)
+                                }
+
+                                GradientButton(title: viewModel.isParaphrasing ? "Paraphrasing..." : "Paraphrase") {
+                                    viewModel.paraphrase()
+                                }
+                                .disabled(!viewModel.canParaphrase)
                             }
-                            .disabled(!viewModel.canParaphrase)
+                            .padding(.bottom, dynamicBottomPadding)
                         }
-                        .frame(maxWidth: 1200, alignment: .topLeading)
-                        .frame(maxWidth: .infinity, alignment: .topLeading)
-                        .padding(.horizontal, dynamicHorizontalPadding)
-                        .padding(.top, AppTheme.brandLabelTopInset)
-                        .padding(.bottom, dynamicBottomPadding)
+                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                     }
+                    .frame(maxWidth: 1200, maxHeight: .infinity, alignment: .topLeading)
+                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
+                    .padding(.horizontal, dynamicHorizontalPadding)
+                    .padding(.top, AppTheme.brandLabelTopInset)
+                    .padding(.bottom, dynamicBottomPadding)
                 }
             }
         }

+ 29 - 25
gramora/Views/PunctuationCheckerView.swift

@@ -40,35 +40,39 @@ struct PunctuationCheckerView: View {
                     .padding(.top, AppTheme.brandLabelTopInset)
                     .padding(.bottom, dynamicBottomPadding)
                 } else {
-                    ScrollView(.vertical, showsIndicators: false) {
-                        VStack(alignment: .leading, spacing: 0) {
-                            header
-                                .padding(.bottom, 24)
-
-                            contentCard
-                                .padding(.bottom, 24)
-
-                            outputCard
-                                .padding(.bottom, 24)
-
-                            if let errorMessage = viewModel.errorMessage {
-                                Text(errorMessage)
-                                    .font(.system(size: 14))
-                                    .foregroundStyle(.red)
-                                    .padding(.bottom, 12)
-                            }
+                    VStack(alignment: .leading, spacing: 0) {
+                        header
+                            .padding(.bottom, 24)
 
-                            GradientButton(title: viewModel.isChecking ? "Checking..." : "Check Punctuation") {
-                                viewModel.checkPunctuation()
+                        ScrollView(.vertical, showsIndicators: false) {
+                            VStack(alignment: .leading, spacing: 0) {
+                                contentCard
+                                    .padding(.bottom, 24)
+
+                                outputCard
+                                    .padding(.bottom, 24)
+
+                                if let errorMessage = viewModel.errorMessage {
+                                    Text(errorMessage)
+                                        .font(.system(size: 14))
+                                        .foregroundStyle(.red)
+                                        .padding(.bottom, 12)
+                                }
+
+                                GradientButton(title: viewModel.isChecking ? "Checking..." : "Check Punctuation") {
+                                    viewModel.checkPunctuation()
+                                }
+                                .disabled(!viewModel.canCheck)
                             }
-                            .disabled(!viewModel.canCheck)
+                            .padding(.bottom, dynamicBottomPadding)
                         }
-                        .frame(maxWidth: 1200, alignment: .topLeading)
-                        .frame(maxWidth: .infinity, alignment: .topLeading)
-                        .padding(.horizontal, dynamicHorizontalPadding)
-                        .padding(.top, AppTheme.brandLabelTopInset)
-                        .padding(.bottom, dynamicBottomPadding)
+                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                     }
+                    .frame(maxWidth: 1200, maxHeight: .infinity, alignment: .topLeading)
+                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
+                    .padding(.horizontal, dynamicHorizontalPadding)
+                    .padding(.top, AppTheme.brandLabelTopInset)
+                    .padding(.bottom, dynamicBottomPadding)
                 }
             }
         }

+ 29 - 25
gramora/Views/SummarizerView.swift

@@ -40,35 +40,39 @@ struct SummarizerView: View {
                     .padding(.top, AppTheme.brandLabelTopInset)
                     .padding(.bottom, dynamicBottomPadding)
                 } else {
-                    ScrollView(.vertical, showsIndicators: false) {
-                        VStack(alignment: .leading, spacing: 0) {
-                            header
-                                .padding(.bottom, 24)
-
-                            contentCard
-                                .padding(.bottom, 24)
-
-                            outputCard
-                                .padding(.bottom, 24)
-
-                            if let errorMessage = viewModel.errorMessage {
-                                Text(errorMessage)
-                                    .font(.system(size: 14))
-                                    .foregroundStyle(.red)
-                                    .padding(.bottom, 12)
-                            }
+                    VStack(alignment: .leading, spacing: 0) {
+                        header
+                            .padding(.bottom, 24)
 
-                            GradientButton(title: viewModel.isSummarizing ? "Summarizing..." : "Summarize") {
-                                viewModel.summarize()
+                        ScrollView(.vertical, showsIndicators: false) {
+                            VStack(alignment: .leading, spacing: 0) {
+                                contentCard
+                                    .padding(.bottom, 24)
+
+                                outputCard
+                                    .padding(.bottom, 24)
+
+                                if let errorMessage = viewModel.errorMessage {
+                                    Text(errorMessage)
+                                        .font(.system(size: 14))
+                                        .foregroundStyle(.red)
+                                        .padding(.bottom, 12)
+                                }
+
+                                GradientButton(title: viewModel.isSummarizing ? "Summarizing..." : "Summarize") {
+                                    viewModel.summarize()
+                                }
+                                .disabled(!viewModel.canSummarize)
                             }
-                            .disabled(!viewModel.canSummarize)
+                            .padding(.bottom, dynamicBottomPadding)
                         }
-                        .frame(maxWidth: 1200, alignment: .topLeading)
-                        .frame(maxWidth: .infinity, alignment: .topLeading)
-                        .padding(.horizontal, dynamicHorizontalPadding)
-                        .padding(.top, AppTheme.brandLabelTopInset)
-                        .padding(.bottom, dynamicBottomPadding)
+                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                     }
+                    .frame(maxWidth: 1200, maxHeight: .infinity, alignment: .topLeading)
+                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
+                    .padding(.horizontal, dynamicHorizontalPadding)
+                    .padding(.top, AppTheme.brandLabelTopInset)
+                    .padding(.bottom, dynamicBottomPadding)
                 }
             }
         }