Skip to content

Commit 6b653de

Browse files
authored
Merge pull request #172 from bounswe/feature/web-footer-legal
feat: add footer and legal pages with shared layout updates
2 parents 0ab98ad + 4b1b8ab commit 6b653de

12 files changed

Lines changed: 561 additions & 83 deletions

File tree

web/src/app/about-project/page.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { AppShell } from "@/components/layout/AppShell";
2+
import { SectionCard } from "@/components/ui/display/SectionCard";
3+
import { SectionHeader } from "@/components/ui/display/SectionHeader";
4+
5+
export default function AboutProjectPage() {
6+
return (
7+
<AppShell title="About Project">
8+
<SectionCard>
9+
<SectionHeader
10+
title="About Our Project"
11+
subtitle="Neighborhood Emergency Preparedness Hub"
12+
/>
13+
14+
<p className="project-paragraph">
15+
Neighborhood Emergency Preparedness Hub supports disaster
16+
preparedness and community resilience by helping individuals
17+
prepare ahead of time and enabling neighbors to coordinate
18+
mutual aid during emergencies.
19+
</p>
20+
21+
<a
22+
href="https://github.com/bounswe/bounswe2026group6/wiki"
23+
target="_blank"
24+
rel="noreferrer"
25+
className="project-link"
26+
>
27+
View Project Wiki
28+
</a>
29+
</SectionCard>
30+
</AppShell>
31+
);
32+
}

web/src/app/donate/page.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { AppShell } from "@/components/layout/AppShell";
2+
import { SectionCard } from "@/components/ui/display/SectionCard";
3+
import { SectionHeader } from "@/components/ui/display/SectionHeader";
4+
import { PrimaryButton } from "@/components/ui/buttons/PrimaryButton";
5+
6+
export default function DonatePage() {
7+
return (
8+
<AppShell title="Donate">
9+
<SectionCard>
10+
<SectionHeader
11+
title="Support Preparedness Efforts"
12+
subtitle="Donation integrations will be connected in a later release."
13+
/>
14+
15+
<p className="project-paragraph">
16+
In upcoming versions, this page will allow secure donations to
17+
support emergency education, volunteer readiness, and community
18+
support activities.
19+
</p>
20+
21+
<div className="donate-action-wrap">
22+
<PrimaryButton disabled>Donation Coming Soon</PrimaryButton>
23+
</div>
24+
</SectionCard>
25+
</AppShell>
26+
);
27+
}

web/src/app/home/page.tsx

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,25 @@ import {
1313
} from "../../lib/emergencyNumbers";
1414
import { mockNews } from "@/lib/news";
1515

16-
const heroSlides = [
16+
type HeroSlide = {
17+
title: string;
18+
description: string;
19+
primaryCtaLabel: string;
20+
primaryCtaHref: string;
21+
secondaryCtaLabel?: string;
22+
secondaryCtaHref?: string;
23+
isMainSlide?: boolean;
24+
};
25+
26+
const heroSlides: HeroSlide[] = [
1727
{
1828
title: "We care for you and every community around you",
1929
description:
2030
"NEPH is a social responsibility initiative focused on preparedness, solidarity, and faster local coordination before and during emergencies.",
21-
primaryCtaLabel: "Open News",
22-
primaryCtaHref: "/news",
23-
secondaryCtaLabel: "Emergency Numbers",
24-
secondaryCtaHref: "/emergency-numbers",
31+
primaryCtaLabel: "Who We Are",
32+
primaryCtaHref: "/who-we-are",
33+
secondaryCtaLabel: "About Us",
34+
secondaryCtaHref: "/about-project",
2535
isMainSlide: true,
2636
},
2737
{
@@ -36,20 +46,16 @@ const heroSlides = [
3646
{
3747
title: "Report incidents from the mobile app",
3848
description:
39-
"Use the NEPH mobile app to quickly submit emergency requests and stay connected with neighborhood responders.",
40-
primaryCtaLabel: "Open News",
41-
primaryCtaHref: "/news",
42-
secondaryCtaLabel: "View Announcements",
43-
secondaryCtaHref: "/news",
49+
"Emergency requests are submitted through the NEPH mobile app so responders can receive faster, location-aware updates during critical moments.",
50+
primaryCtaLabel: "Download Mobile App",
51+
primaryCtaHref: "#",
4452
},
4553
{
4654
title: "Track local updates in one place",
4755
description:
4856
"Follow announcements, preparedness updates, and community coordination news from a single dashboard.",
4957
primaryCtaLabel: "Browse News",
5058
primaryCtaHref: "/news",
51-
secondaryCtaLabel: "View Announcements",
52-
secondaryCtaHref: "/news",
5359
},
5460
];
5561

@@ -89,12 +95,14 @@ export default function HomePage() {
8995
{currentSlide.primaryCtaLabel}
9096
</PrimaryButton>
9197

92-
<SecondaryButton
93-
className="home-hero-secondary-action"
94-
onClick={() => router.push(currentSlide.secondaryCtaHref)}
95-
>
96-
{currentSlide.secondaryCtaLabel}
97-
</SecondaryButton>
98+
{currentSlide.secondaryCtaHref && currentSlide.secondaryCtaLabel ? (
99+
<SecondaryButton
100+
className="home-hero-secondary-action"
101+
onClick={() => router.push(currentSlide.secondaryCtaHref!)}
102+
>
103+
{currentSlide.secondaryCtaLabel}
104+
</SecondaryButton>
105+
) : null}
98106
</div>
99107
</div>
100108

web/src/app/layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import "../styles/globals.css";
22
import type { Metadata } from "next";
3+
import { SiteFooter } from "@/components/layout/SiteFooter";
34

45
export const metadata: Metadata = {
56
title: "NEPH",
@@ -13,7 +14,10 @@ export default function RootLayout({
1314
}>) {
1415
return (
1516
<html lang="en">
16-
<body>{children}</body>
17+
<body className="root-layout-body">
18+
<main className="root-layout-content">{children}</main>
19+
<SiteFooter />
20+
</body>
1721
</html>
1822
);
1923
}

web/src/app/privacy-policy/page.tsx

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,67 @@
1-
import Link from "next/link";
21
import { PageContainer } from "@/components/layout/PageContainer";
32
import { SectionCard } from "@/components/ui/display/SectionCard";
43
import { SectionHeader } from "@/components/ui/display/SectionHeader";
4+
import { BackButton } from "@/components/ui/navigation/BackButton";
55

6-
type PrivacyPolicyPageProps = {
7-
searchParams?: Promise<{
8-
from?: string;
9-
}>;
10-
};
11-
12-
export default async function PrivacyPolicyPage({
13-
searchParams,
14-
}: PrivacyPolicyPageProps) {
15-
const params = await searchParams;
16-
const backHref = params?.from === "signup" ? "/signup?restore=1" : "/signup";
6+
export default function PrivacyPolicyPage() {
177

188
return (
19-
<div className="min-h-screen bg-[#F8F8F9] py-10">
9+
<div className="policy-page">
2010
<PageContainer>
21-
<div className="mx-auto max-w-3xl">
22-
<Link
23-
href={backHref}
24-
className="text-sm font-medium text-[#D84A4A] hover:underline"
25-
>
26-
← Back to Sign Up
27-
</Link>
11+
<div className="policy-content-wrap">
12+
<BackButton className="policy-back-link" />
2813

29-
<SectionCard className="mt-4">
14+
<SectionCard className="policy-card">
3015
<SectionHeader
3116
title="Privacy Policy"
3217
subtitle="Last updated: March 2026"
3318
/>
3419

35-
<div className="space-y-5 text-sm leading-7 text-[#2B2B33]">
20+
<div className="policy-body">
3621
<p>
3722
This page is a placeholder Privacy Policy for the NEPH MVP.
3823
It describes how user-provided information may be handled
3924
within the project’s early development scope.
4025
</p>
4126

4227
<div>
43-
<h3 className="text-base font-semibold">
28+
<h3 className="policy-section-title">
4429
1. Information collected
4530
</h3>
46-
<p className="mt-2">
31+
<p className="policy-section-text">
4732
NEPH may collect information such as name, email,
4833
phone number, and emergency-related profile details
4934
entered by the user.
5035
</p>
5136
</div>
5237

5338
<div>
54-
<h3 className="text-base font-semibold">
39+
<h3 className="policy-section-title">
5540
2. Purpose of use
5641
</h3>
57-
<p className="mt-2">
42+
<p className="policy-section-text">
5843
This information is used to support account creation,
5944
emergency preparedness features, and user coordination
6045
flows within the MVP.
6146
</p>
6247
</div>
6348

6449
<div>
65-
<h3 className="text-base font-semibold">
50+
<h3 className="policy-section-title">
6651
3. Data protection
6752
</h3>
68-
<p className="mt-2">
53+
<p className="policy-section-text">
6954
As an academic MVP, NEPH is still under development.
7055
Full production-grade privacy safeguards may not yet be
7156
fully implemented.
7257
</p>
7358
</div>
7459

7560
<div>
76-
<h3 className="text-base font-semibold">
61+
<h3 className="policy-section-title">
7762
4. Policy updates
7863
</h3>
79-
<p className="mt-2">
64+
<p className="policy-section-text">
8065
This privacy policy may be updated in later project
8166
phases as the platform and backend capabilities evolve.
8267
</p>

web/src/app/terms-of-service/page.tsx

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,67 @@
1-
import Link from "next/link";
21
import { PageContainer } from "@/components/layout/PageContainer";
32
import { SectionCard } from "@/components/ui/display/SectionCard";
43
import { SectionHeader } from "@/components/ui/display/SectionHeader";
4+
import { BackButton } from "@/components/ui/navigation/BackButton";
55

6-
type TermsOfServicePageProps = {
7-
searchParams?: Promise<{
8-
from?: string;
9-
}>;
10-
};
11-
12-
export default async function TermsOfServicePage({
13-
searchParams,
14-
}: TermsOfServicePageProps) {
15-
const params = await searchParams;
16-
const backHref = params?.from === "signup" ? "/signup?restore=1" : "/signup";
6+
export default function TermsOfServicePage() {
177

188
return (
19-
<div className="min-h-screen bg-[#F8F8F9] py-10">
9+
<div className="policy-page">
2010
<PageContainer>
21-
<div className="mx-auto max-w-3xl">
22-
<Link
23-
href={backHref}
24-
className="text-sm font-medium text-[#D84A4A] hover:underline"
25-
>
26-
← Back to Sign Up
27-
</Link>
11+
<div className="policy-content-wrap">
12+
<BackButton className="policy-back-link" />
2813

29-
<SectionCard className="mt-4">
14+
<SectionCard className="policy-card">
3015
<SectionHeader
3116
title="Terms of Service"
3217
subtitle="Last updated: March 2026"
3318
/>
3419

35-
<div className="space-y-5 text-sm leading-7 text-[#2B2B33]">
20+
<div className="policy-body">
3621
<p>
3722
This page is a placeholder Terms of Service for the
3823
NEPH MVP. It explains the general expectations for using
3924
the platform during the early development phase.
4025
</p>
4126

4227
<div>
43-
<h3 className="text-base font-semibold">
28+
<h3 className="policy-section-title">
4429
1. Use of the platform
4530
</h3>
46-
<p className="mt-2">
31+
<p className="policy-section-text">
4732
NEPH is intended to support emergency preparedness and
4833
neighborhood coordination. Users should provide
4934
accurate information and use the platform responsibly.
5035
</p>
5136
</div>
5237

5338
<div>
54-
<h3 className="text-base font-semibold">
39+
<h3 className="policy-section-title">
5540
2. Account responsibility
5641
</h3>
57-
<p className="mt-2">
42+
<p className="policy-section-text">
5843
Users are responsible for maintaining the accuracy of
5944
their account information and keeping their credentials
6045
secure.
6146
</p>
6247
</div>
6348

6449
<div>
65-
<h3 className="text-base font-semibold">
50+
<h3 className="policy-section-title">
6651
3. Platform limitations
6752
</h3>
68-
<p className="mt-2">
53+
<p className="policy-section-text">
6954
NEPH is an academic MVP and may not include full
7055
production-grade guarantees, legal protections, or
7156
emergency service integration at this stage.
7257
</p>
7358
</div>
7459

7560
<div>
76-
<h3 className="text-base font-semibold">
61+
<h3 className="policy-section-title">
7762
4. Future updates
7863
</h3>
79-
<p className="mt-2">
64+
<p className="policy-section-text">
8065
These terms may be revised as the project evolves and
8166
more complete platform policies are defined.
8267
</p>

0 commit comments

Comments
 (0)