Skip to content

Feat: Add footer#14

Merged
SimonBurmer merged 3 commits intomainfrom
addfooder
Mar 24, 2026
Merged

Feat: Add footer#14
SimonBurmer merged 3 commits intomainfrom
addfooder

Conversation

@SimonBurmer
Copy link
Copy Markdown
Collaborator

@SimonBurmer SimonBurmer commented Mar 24, 2026

Summary by CodeRabbit

  • New Features

    • Added Legal Notice and Privacy Policy pages
    • Added footer with navigation links and social media icons
    • Enhanced member testimonials with partner logo display
  • Style

    • Updated Members page hero background image
    • Removed date badges from event cards for cleaner presentation
    • Improved page layout with integrated footer

@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 24, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
website-special-pages-y5ch Ready Ready Preview, Comment Mar 24, 2026 9:28am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 24, 2026

📝 Walkthrough

Walkthrough

This PR introduces a restructured layout with a new Footer component, adds new legal and privacy policy pages, removes date badges from event cards, extends the member journey data model to support multiple logos, and updates the testimonials component to render logo arrays with optional links.

Changes

Cohort / File(s) Summary
Layout & Footer
app/layout.tsx, components/Footer.tsx
Added Footer component to layout, restructured body with flexbox (flex flex-col min-h-screen), wrapped children in <main> with flex-grow for proper spacing distribution.
New Legal Pages
app/legal-notice/page.tsx, app/privacy-policy/page.tsx
Created two new page components with placeholder content, full-height dark-blue layouts, centered headings, and prose sections.
Event Cards
components/PastEventsGrid.tsx, components/UpcomingEventsGrid.tsx
Removed date badge UI elements from both past and upcoming event cards; updated content container styling in UpcomingEventsGrid.
Testimonials & Member Data
app/member-journey/page.tsx, components/TestimonialsSection.tsx
Extended MemberStory to include optional logos array; updated first two member story entries with new logos; replaced single-logo fields in TestimonialItem with logos array and added logo rendering with optional URL linking in testimonial content.
Styling Updates
app/events/page.tsx, app/members/page.tsx
Changed "PAST EVENTS" wrapper from bottom margin to bottom padding; updated Members page hero background image asset path.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

  • Feat/UI improvements #10 — Modifies events and past-events UI with changes to event card layouts and styling (app/events/page.tsx, components/PastEventsGrid.tsx).

Poem

🐰 A footer hops in with grace so fine,
New pages arise for legal design,
Logos bloom where testimonies dwell,
Date badges fade—a visual spell,
Flexbox flexes, layouts align! ✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The PR title 'Feat: Add footer' is partially related to the changeset. While a Footer component is indeed added, the PR contains significantly broader changes including layout restructuring, new legal/privacy pages, member journey updates, and styling modifications across multiple files. Consider a more comprehensive title that reflects the full scope of changes, such as 'Feat: Add footer and restructure layout with new legal pages' or break this into multiple focused PRs.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch addfooder

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (6)
components/UpcomingEventsGrid.tsx (2)

98-116: formattedDate is computed but never used.

The date parsing logic remains in the code, but since the date badge display was removed, formattedDate is now dead code. Consider removing this block to reduce code complexity.

🧹 Proposed cleanup
-          // Parse the date and handle different formats
-          let formattedDate = 'Date unavailable'
-
-          try {
-            const dateStr = event.start_at
-
-            if (dateStr) {
-              const eventDate = new Date(dateStr)
-
-              if (!isNaN(eventDate.getTime())) {
-                formattedDate = eventDate.toLocaleDateString('en-US', {
-                  month: 'short',
-                  day: 'numeric',
-                  year: 'numeric'
-                })
-              }
-            }
-          } catch (err) {
-            console.error('Error parsing date:', err, event)
-          }
-
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/UpcomingEventsGrid.tsx` around lines 98 - 116, Remove the unused
date-parsing block that defines formattedDate and reads event.start_at inside
the UpcomingEventsGrid component: delete the declaration "let formattedDate =
'Date unavailable'", the try/catch that constructs eventDate and sets
formattedDate, and the console.error catch — or alternatively replace it by
using formattedDate where intended; ensure no references to formattedDate remain
in the component so there are no unused variables.

38-40: Remove debug console.log statements before merging.

These debug logging statements should be removed for production code as they expose internal API response structure and add unnecessary console noise.

🧹 Proposed fix
-        // Log the full API response for debugging
-        console.log('Upcoming Events API Response:', data)
-        console.log('Number of upcoming events:', data.entries?.length || 0)
-
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/UpcomingEventsGrid.tsx` around lines 38 - 40, Remove the two debug
console.log statements in the UpcomingEventsGrid component that output 'Upcoming
Events API Response:' and 'Number of upcoming events:'; locate these calls
inside components/UpcomingEventsGrid.tsx (within the UpcomingEventsGrid
component or its data-fetching handler) and delete them, or replace them with a
guarded debug/logging mechanism (e.g., a logger.debug or process.env.DEBUG
check) if persistent, non-production logging is required.
app/legal-notice/page.tsx (1)

1-17: Consider adding a max-width constraint for better readability on wide screens.

The content container lacks a max-w-* constraint, which could cause text to span excessively wide on large screens, reducing readability. The Navigation component uses px-10 lg:px-20 with content centered, but this page might benefit from a max-width container similar to other pages.

✨ Proposed enhancement
 export default function LegalNoticePage() {
   return (
     <div className="min-h-screen bg-brand-dark-blue">
-      <div className="mx-auto px-10 lg:px-20 py-20">
+      <div className="max-w-7xl mx-auto px-10 lg:px-20 py-20">
         <h1 className="text-4xl md:text-5xl font-black text-white mb-12">
           LEGAL NOTICE
         </h1>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/legal-notice/page.tsx` around lines 1 - 17, The page lacks a max-width on
the content container which makes text too wide on large screens; update the
inner container used in LegalNoticePage (the div with classes "mx-auto px-10
lg:px-20 py-20") to include a sensible max-w class (e.g., max-w-2xl or
max-w-prose) or wrap the prose block in a container with a max-w-* class so the
"prose prose-invert max-w-none" content gets constrained for improved
readability on wide screens.
app/privacy-policy/page.tsx (1)

1-17: Consider extracting a shared layout component for legal pages.

This page has identical structure to app/legal-notice/page.tsx. Consider creating a reusable LegalPageLayout component to reduce duplication and ensure consistent styling across legal pages.

Also, the same max-w-7xl constraint suggestion from the legal notice page applies here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/privacy-policy/page.tsx` around lines 1 - 17, This page duplicates the
structure in app/legal-notice/page.tsx; extract a reusable component (e.g.,
LegalPageLayout) and update both PrivacyPolicyPage and the LegalNotice page to
render inside that component to remove duplication and ensure consistent
styling; move the outer wrapper and common classes (min-h-screen
bg-brand-dark-blue, mx-auto px-10 lg:px-20 py-20, H1 styling, and the prose
container) into LegalPageLayout, accept props for title and children, and adjust
the inner container to use the suggested max-w-7xl constraint (replace current
max-w-none with max-w-7xl) so both PrivacyPolicyPage and LegalNotice import and
use LegalPageLayout.
components/Footer.tsx (1)

6-6: Minor: extra space in className attribute and consider responsive padding.

There's an extra space before mx-auto in the className. Also, px-20 may cause horizontal overflow issues on small mobile screens.

✨ Proposed fix
-      <div className= "mx-auto px-20 py-10">
+      <div className="mx-auto px-6 md:px-10 lg:px-20 py-10">

As per coding guidelines: "Implement responsive design" - the fixed px-20 padding could cause layout issues on smaller viewports.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/Footer.tsx` at line 6, In the Footer component update the div with
className to remove the leading space before "mx-auto" and replace the fixed
"px-20" with responsive padding classes (e.g., use small-screen default like
"px-4" and then increase at breakpoints such as "sm:px-6" or "lg:px-20") so it
no longer overflows on mobile; locate the div in Footer.tsx (the JSX element
containing className "mx-auto px-20 py-10") and apply the corrected className
string.
components/TestimonialsSection.tsx (1)

70-70: Remove duplicate Tailwind utility

Line 70 includes w-auto twice. This is harmless but should be cleaned up for readability.

Proposed fix
-                                                    className="h-5 w-auto w-auto object-contain"
+                                                    className="h-5 w-auto object-contain"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/TestimonialsSection.tsx` at line 70, In TestimonialsSection.tsx
remove the duplicated Tailwind utility by editing the className string on the
element that currently has "h-5 w-auto w-auto object-contain" (inside the
TestimonialsSection component) so it becomes a single "w-auto" (e.g., "h-5
w-auto object-contain"); update the className value to remove the redundant
token for clarity.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/TestimonialsSection.tsx`:
- Line 12: The logos prop and rendering in TestimonialsSection currently reuse
item.company for all logo accessible names, causing ambiguous labels; update the
logos type to include a per-logo accessible label (e.g., logos?: { src: string;
url?: string; label?: string }[]) and change the render logic in
TestimonialsSection where logos are mapped to use logo.label (fallback to
item.company only when absent) for both the anchor aria-label and the img alt
attribute so each logo has its own descriptive accessible name.

---

Nitpick comments:
In `@app/legal-notice/page.tsx`:
- Around line 1-17: The page lacks a max-width on the content container which
makes text too wide on large screens; update the inner container used in
LegalNoticePage (the div with classes "mx-auto px-10 lg:px-20 py-20") to include
a sensible max-w class (e.g., max-w-2xl or max-w-prose) or wrap the prose block
in a container with a max-w-* class so the "prose prose-invert max-w-none"
content gets constrained for improved readability on wide screens.

In `@app/privacy-policy/page.tsx`:
- Around line 1-17: This page duplicates the structure in
app/legal-notice/page.tsx; extract a reusable component (e.g., LegalPageLayout)
and update both PrivacyPolicyPage and the LegalNotice page to render inside that
component to remove duplication and ensure consistent styling; move the outer
wrapper and common classes (min-h-screen bg-brand-dark-blue, mx-auto px-10
lg:px-20 py-20, H1 styling, and the prose container) into LegalPageLayout,
accept props for title and children, and adjust the inner container to use the
suggested max-w-7xl constraint (replace current max-w-none with max-w-7xl) so
both PrivacyPolicyPage and LegalNotice import and use LegalPageLayout.

In `@components/Footer.tsx`:
- Line 6: In the Footer component update the div with className to remove the
leading space before "mx-auto" and replace the fixed "px-20" with responsive
padding classes (e.g., use small-screen default like "px-4" and then increase at
breakpoints such as "sm:px-6" or "lg:px-20") so it no longer overflows on
mobile; locate the div in Footer.tsx (the JSX element containing className
"mx-auto px-20 py-10") and apply the corrected className string.

In `@components/TestimonialsSection.tsx`:
- Line 70: In TestimonialsSection.tsx remove the duplicated Tailwind utility by
editing the className string on the element that currently has "h-5 w-auto
w-auto object-contain" (inside the TestimonialsSection component) so it becomes
a single "w-auto" (e.g., "h-5 w-auto object-contain"); update the className
value to remove the redundant token for clarity.

In `@components/UpcomingEventsGrid.tsx`:
- Around line 98-116: Remove the unused date-parsing block that defines
formattedDate and reads event.start_at inside the UpcomingEventsGrid component:
delete the declaration "let formattedDate = 'Date unavailable'", the try/catch
that constructs eventDate and sets formattedDate, and the console.error catch —
or alternatively replace it by using formattedDate where intended; ensure no
references to formattedDate remain in the component so there are no unused
variables.
- Around line 38-40: Remove the two debug console.log statements in the
UpcomingEventsGrid component that output 'Upcoming Events API Response:' and
'Number of upcoming events:'; locate these calls inside
components/UpcomingEventsGrid.tsx (within the UpcomingEventsGrid component or
its data-fetching handler) and delete them, or replace them with a guarded
debug/logging mechanism (e.g., a logger.debug or process.env.DEBUG check) if
persistent, non-production logging is required.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dc4077e8-d10f-4a16-a727-6b63f330e0ec

📥 Commits

Reviewing files that changed from the base of the PR and between 5aa8a0c and 74f2b91.

⛔ Files ignored due to path filters (3)
  • public/memberJourney/alumni/FelixHaas.png is excluded by !**/*.png
  • public/memberJourney/alumni/JoshuaCornelius.png is excluded by !**/*.png
  • public/ourMembers/hero.png is excluded by !**/*.png
📒 Files selected for processing (10)
  • app/events/page.tsx
  • app/layout.tsx
  • app/legal-notice/page.tsx
  • app/member-journey/page.tsx
  • app/members/page.tsx
  • app/privacy-policy/page.tsx
  • components/Footer.tsx
  • components/PastEventsGrid.tsx
  • components/TestimonialsSection.tsx
  • components/UpcomingEventsGrid.tsx
💤 Files with no reviewable changes (1)
  • components/PastEventsGrid.tsx

quote: string
logo?: string // Optional additional logo (like partner logo)
logoAlt?: string // Optional alt text for the logo
logos?: { src: string; url?: string }[] // Optional logos with optional links
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add per-logo accessible labels instead of reusing company name

Line 12 and Line 69 force all logo images/links to share the same label (item.company). With multiple logos, this gives ambiguous/incorrect accessible names.

Proposed fix
 export interface TestimonialItem {
     id: string
     name: string
     role: string
     company: string // This can be company name or partner name
     image: string
     story: string
     quote: string
-    logos?: { src: string; url?: string }[] // Optional logos with optional links
+    logos?: { src: string; alt: string; url?: string }[] // Optional logos with optional links
 }
@@
                                             const logoImg = (
                                                 <img
                                                     src={logo.src}
-                                                    alt={item.company}
+                                                    alt={logo.alt}
                                                     className="h-5 w-auto w-auto object-contain"
                                                     onError={(e) => {
                                                         const target = e.target as HTMLImageElement
                                                         target.style.display = 'none'
                                                     }}
                                                 />
                                             )
                                             return logo.url ? (
-                                                <a key={index} href={logo.url} target="_blank" rel="noopener noreferrer" className="rounded p-1 shadow-lg hover:opacity-80 transition-opacity">
+                                                <a key={index} href={logo.url} target="_blank" rel="noopener noreferrer" aria-label={logo.alt} className="rounded p-1 shadow-lg hover:opacity-80 transition-opacity">
                                                     {logoImg}
                                                 </a>
                                             ) : (

Also applies to: 67-79

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/TestimonialsSection.tsx` at line 12, The logos prop and rendering
in TestimonialsSection currently reuse item.company for all logo accessible
names, causing ambiguous labels; update the logos type to include a per-logo
accessible label (e.g., logos?: { src: string; url?: string; label?: string }[])
and change the render logic in TestimonialsSection where logos are mapped to use
logo.label (fallback to item.company only when absent) for both the anchor
aria-label and the img alt attribute so each logo has its own descriptive
accessible name.

@SimonBurmer SimonBurmer merged commit fe20e82 into main Mar 24, 2026
3 checks passed
@SimonBurmer SimonBurmer deleted the addfooder branch March 25, 2026 17:52
This was referenced Mar 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant