diff --git a/src/app/_component/home-page.tsx b/src/app/_component/home-page.tsx
index 7d4109b..ad137ef 100644
--- a/src/app/_component/home-page.tsx
+++ b/src/app/_component/home-page.tsx
@@ -1,12 +1,24 @@
import Banner from '@/components/banner/banner';
import FrequentlyAskedQuestions from '@/components/faq/faq';
+import MissionOverview from '@/components/mission-overview/mission-overview';
import ProjectOverview from '@/components/project-overview/project-overview';
+import { Button } from '@mui/material';
export function HomePage() {
return (
+
+
+
);
diff --git a/src/app/about-us/about-us.scss b/src/app/about-us/about-us.scss
new file mode 100644
index 0000000..b4d0b71
--- /dev/null
+++ b/src/app/about-us/about-us.scss
@@ -0,0 +1,99 @@
+@use '../globals.scss' as *;
+
+.join-us {
+ @include tablet {
+ padding: 0 2rem;
+ }
+ @include mobile {
+ padding: 0 1rem;
+ }
+ &__heading {
+ &--primary {
+ font-weight: 700;
+ }
+
+ &--secondary {
+ font-weight: 600;
+ }
+ }
+
+ &__text-container {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ }
+
+ &__text {
+ font-size: 1.5rem;
+ letter-spacing: -0.48px;
+ color: $text-color-primary;
+ font-family: inherit;
+ }
+
+ &__button {
+ min-width: 184px;
+
+ @include mobile {
+ width: 100%;
+ }
+ }
+}
+
+.join-us-banner {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 2rem;
+ padding: 6rem 0;
+
+ @include tablet {
+ flex-direction: column-reverse;
+ padding: 3rem 0;
+ }
+
+ @include mobile {
+ padding: 2rem 0;
+ }
+
+ &__text-container {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ @include tablet {
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ }
+ }
+
+ &__image-container {
+ padding: 0 2rem;
+ max-width: 472px;
+ max-width: 405.265px;
+ flex-shrink: 0;
+
+ @include tablet {
+ max-width: 544px;
+ max-height: 467px;
+ flex-shrink: 1;
+ }
+ }
+
+ &__image {
+ width: 100%;
+ height: 100%;
+ }
+
+ &__button-container {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ margin-top: 2.25rem;
+
+ @include mobile {
+ width: 100%;
+ flex-direction: column;
+ }
+ }
+}
diff --git a/src/app/join-us/join-us.page.test.tsx b/src/app/about-us/about.page.test.tsx
similarity index 74%
rename from src/app/join-us/join-us.page.test.tsx
rename to src/app/about-us/about.page.test.tsx
index c836218..66292d6 100644
--- a/src/app/join-us/join-us.page.test.tsx
+++ b/src/app/about-us/about.page.test.tsx
@@ -1,11 +1,11 @@
-import JoinUs from '@/app/join-us/page';
+import AboutUs from '@/app/about-us/page';
import '@testing-library/jest-dom';
import { render, screen } from '@testing-library/react';
import React from 'react';
-describe('Join Us Page', () => {
+describe('About Page', () => {
it('should render title', () => {
- render();
+ render();
const subTitle = screen.getByRole('heading', { name: 'Our Mission' });
expect(subTitle).toBeInTheDocument();
});
diff --git a/src/app/about-us/page.client.tsx b/src/app/about-us/page.client.tsx
new file mode 100644
index 0000000..8ee71fc
--- /dev/null
+++ b/src/app/about-us/page.client.tsx
@@ -0,0 +1,67 @@
+'use client';
+
+import CoreValues from '@/components/core-values/core-values';
+import FrequentlyAskedQuestions from '@/components/faq/faq';
+import JoinUsTab from '@/components/join-us-tab/join-us-tab';
+import MissionOverview from '@/components/mission-overview/mission-overview';
+import { Box, Button, Container, Typography } from '@mui/material';
+import Script from 'next/script';
+import React from 'react';
+import './about-us.scss';
+
+export default function AboutUs() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ Visions
+
+
+ Envisioning British Columbia where technology and unity ignite
+ sustainable progress, we're committed to empowering
+ communities through innovation and collaboration for a brighter,
+ inclusive future.
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/about-us/page.tsx b/src/app/about-us/page.tsx
new file mode 100644
index 0000000..e7e171a
--- /dev/null
+++ b/src/app/about-us/page.tsx
@@ -0,0 +1,12 @@
+import { Metadata } from 'next';
+import AboutUsClient from './page.client';
+
+export const metadata: Metadata = {
+ title: 'About Us & Get Engaged | CodeForBC',
+ description:
+ 'Learn more about CodeForBC and How to join the CodeForBC organization',
+};
+
+export default function AboutUs() {
+ return ;
+}
diff --git a/src/app/about/about.scss b/src/app/about/about.scss
deleted file mode 100644
index a3a50fc..0000000
--- a/src/app/about/about.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
- .container {
- display: flex;
- flex-direction: column;
- height: 100%;
- margin-top: 2%;
-
- .about-header {
- font-family: inherit;
- font-weight: 700;
- }
- }
-}
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
deleted file mode 100644
index 73fdff4..0000000
--- a/src/app/about/page.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import React from 'react';
-import { Typography } from '@mui/material';
-import Container from '@mui/material/Container';
-import './about.scss';
-
-export default function About() {
- return (
-
-
- About
-
-
- OpenBC, a community-driven initiative dedicated to harnessing the power
- of technology, collaboration, and innovation to create positive impacts
- across British Columbia, Canada. Our mission is to bring together
- individuals passionate about technology, civic engagement, and community
- development to address the unique challenges and opportunities faced by
- our province.
-
-
-
- Utilize Your Skills for the Betterment of British Columbia with OpenBC
-
-
-
- Unlock the power of your skills and expertise to drive positive change
- in British Columbia through OpenBC. At OpenBC, we're passionate
- about leveraging your unique abilities for the advancement of our
- province. Whether you're a tech enthusiast, a creative visionary,
- or a community leader, your skills can play a crucial role in addressing
- challenges and creating opportunities.
-
-
-
- Contribute to Open Source Projects for BC, from Anywhere, with OpenBC
-
-
-
- );
-}
diff --git a/src/app/code-of-conduct/code-of-conduct-page.test.tsx b/src/app/code-of-conduct/code-of-conduct-page.test.tsx
new file mode 100644
index 0000000..444e865
--- /dev/null
+++ b/src/app/code-of-conduct/code-of-conduct-page.test.tsx
@@ -0,0 +1,12 @@
+import CodeOfConduct from '@/app/code-of-conduct/page';
+import '@testing-library/jest-dom';
+import { render, screen } from '@testing-library/react';
+import React from 'react';
+
+describe('Code of Conduct Page', () => {
+ it('should render title', () => {
+ render();
+ const title = screen.getByText('CodeForBC is a space for everyone.');
+ expect(title).toBeInTheDocument();
+ });
+});
diff --git a/src/app/code-of-conduct/code-of-conduct.scss b/src/app/code-of-conduct/code-of-conduct.scss
new file mode 100644
index 0000000..7e2fc84
--- /dev/null
+++ b/src/app/code-of-conduct/code-of-conduct.scss
@@ -0,0 +1,178 @@
+@use '../globals.scss' as *;
+
+.code-of-conduct {
+
+ @include tablet {
+ padding: 0 6.125rem;
+ }
+
+ @include mobile {
+ padding: 0 1rem;
+ }
+
+ &__heading-container {
+ padding: 6rem 0;
+
+ @include tablet {
+ padding: 3rem 0;
+ }
+
+ @include mobile {
+ padding: 2rem 0;
+ }
+ }
+
+ &__heading {
+ font-family: inherit;
+ font-size: 2.75rem;
+ line-height: 3.4375rem;
+ font-weight: 600;
+ color: $heading-color-primary;
+ }
+
+ &__main-wrapper {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ gap: 4rem;
+ padding: 4rem 0;
+
+ @include tablet {
+ gap: 2rem;
+ padding: 3rem 0;
+ }
+
+ @include mobile {
+ padding: 2rem 0;
+ }
+ }
+
+ &__wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+
+ @include tablet {
+ gap: 1.5rem;
+ }
+ }
+
+ &__sub-heading {
+ font-family: inherit;
+ font-size: 2rem;
+ line-height: 2.5rem;
+ font-weight: 600;
+ color: $navbar-text-color;
+
+ @include tablet {
+ font-size: 1.75rem;
+ line-height: 2.1875rem;
+ }
+
+ @include mobile {
+ font-size: 1.5rem;
+ line-height: 1.875rem;
+ }
+ }
+
+ &__text {
+ font-family: inherit;
+ font-size: 1.75rem;
+ line-height: 2.1875rem;
+ font-weight: 500;
+ color: $navbar-text-color;
+
+ @include tablet {
+ font-size: 1.5rem;
+ line-height: 1.875rem;
+ }
+
+ @include mobile {
+ font-size: 1.25rem;
+ line-height: 1.5625rem;
+ }
+ }
+
+ &__list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ }
+
+ &__list-item {
+ font-family: inherit;
+ font-size: 1.5rem;
+ font-weight: 500;
+ line-height: 1.875rem;
+ color: $navbar-text-color;
+
+ @include tablet {
+ font-size: 1.25rem;
+ line-height: 1.5625rem;
+ }
+ }
+
+ &__list-text {
+ font-family: inherit;
+ font-size: 1.5rem;
+ font-weight: 500;
+ line-height: 1.875rem;
+ color: $navbar-text-color;
+
+ @include tablet {
+ font-size: 1.25rem;
+ line-height: 1.5625rem;
+ }
+ }
+
+ &__tertiary-heading {
+ font-family: inherit;
+ font-size: 1.75rem;
+ line-height: 2.1875rem;
+ font-weight: 700;
+ color: $navbar-text-color;
+
+ @include tablet {
+ font-size: 1.5rem;
+ line-height: 1.875rem;
+ }
+
+ @include mobile {
+ font-size: 1.25rem;
+ line-height: 1.5625rem;
+ }
+ }
+
+ &__reporting-template {
+ max-width: 800px;
+ padding: 1rem;
+ box-shadow: 0px 10px 20px -3px rgba(16, 24, 40, 0.10), 0px 4px 6px -4px rgba(16, 24, 40, 0.10);
+ align-self: center;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ &__note {
+ padding: 6rem 0;
+
+ @include tablet {
+ padding: 3rem 0;
+ }
+
+ @include mobile {
+ padding: 2rem 0;
+ }
+ }
+
+ &__note-text {
+ font-family: inherit;
+ font-size: 1.75rem;
+ line-height: 2.1875rem;
+ font-weight: 600;
+ color: $text-color-primary;
+ padding-top: 1rem;
+ border-top: 1.6px solid $divider-color-secondary;
+ }
+}
diff --git a/src/app/code-of-conduct/page.tsx b/src/app/code-of-conduct/page.tsx
new file mode 100644
index 0000000..f0c1d3f
--- /dev/null
+++ b/src/app/code-of-conduct/page.tsx
@@ -0,0 +1,174 @@
+import { Box, Container, Typography } from '@mui/material';
+import './code-of-conduct.scss';
+
+export default function CodeOfConduct() {
+ return (
+
+
+
+ CodeForBC is a space for everyone.
+
+
+
+
+
+ Our Commitment
+
+
+ CodeForBC is a volunteer-driven organization committed to leveraging
+ technology for the betterment of British Columbia. We aim to create
+ a positive impact and contribute to our community's growth and
+ development through technology, collaboration, and innovation. Below
+ is the full text of the CodeForBC Code of Conduct. For any questions
+ or clarifications regarding this Code of Conduct, please feel free
+ to reach out
+
+
+
+
+ Code of Conduct
+
+
+ In all CodeForBC activities, events, and digital forums, we expect
+ participants to:
+
+
+
+
+ Foster a Safe and Respectful Environment: We
+ are committed to creating a space where every participant feels
+ safe, respected, and free to express their identity without fear
+ of discrimination or harassment.
+
+
+
+
+ Embrace Diversity and Inclusion: We value
+ diverse ideas, skills, and contributions, encouraging
+ participation from everyone, especially those traditionally
+ marginalized in tech and civic processes.
+
+
+
+
+ Promote Positive Interaction: We advocate for
+ inclusive language, a "yes/and" approach in
+ discussions, and encourage listening and balanced participation.
+
+
+
+
+ Support Community Collaboration: Our focus is
+ on building open and freely available tools for public use, with
+ an emphasis on public benefit rather than private gain.
+
+
+
+
+ Encourage Active Participation: We welcome
+ participants from all backgrounds and skill levels, fostering an
+ environment of questions, mentorship, and knowledge sharing.
+
+
+
+
+ Maintain Professional and Ethical Standards: We
+ ensure respectful and participatory interactions within our
+ community and with our partners
+
+
+
+
+
+
+ Anti-Harassment Policy
+
+
+ CodeForBC is committed to a harassment-free experience for everyone,
+ regardless of identity. We do not tolerate harassment in any form,
+ including but not limited to:
+
+
+
+
+ Reporting and Enforcement
+
+
+ Participants exhibiting harassing behavior are expected to comply
+ immediately upon request to stop. CodeForBC organizers may take
+ actions like warning or expulsion from events and forums.
+
+
+ In Case of Harassment:
+
+
+
+
+ In emergencies, call 911 or remove yourself from the situation.
+
+
+
+
+ Contact CodeForBC leadership at codeforbc@gmail.com
+
+
+
+
+ Reporting Template for Anti-Harassment
+
+
+
+ Subject: Harassment Report at [EVENT NAME]
+
+
+ Content:
+
+
+ I am reporting an issue of harassment at CodeForBC, [EVENT NAME,
+ LOCATION, DATE]. My contact information is [CONTACT INFO]. Thank
+ you for addressing this matter.
+
+
+
+
+
+
+ CodeForBC values each member and believes in a community where
+ everyone can contribute in a safe, respectful, and harassment-free
+ environment. These guidelines reflect our commitment to these values
+ and our dedication to upholding them in all our endeavors.
+
+
+
+ );
+}
diff --git a/src/app/dataModels/project.ts b/src/app/dataModels/project.ts
index 9502f58..01e08f6 100644
--- a/src/app/dataModels/project.ts
+++ b/src/app/dataModels/project.ts
@@ -12,4 +12,12 @@ export interface Project {
location?: string;
status?: ProjectStatusEnum;
contributors?: string[];
+ projectImage: string;
+ projectKey: string;
+ projectOverview?: {
+ problemStatement: string;
+ projectObjectives: string[];
+ projectLead: string;
+ lookingFor: string[];
+ };
}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
index d6299c5..b206f69 100644
Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ
diff --git a/src/app/globals.scss b/src/app/globals.scss
index 99d4b18..358194b 100644
--- a/src/app/globals.scss
+++ b/src/app/globals.scss
@@ -1,13 +1,41 @@
-@import url("https://use.typekit.net/qnx3faq.css");
+@import url('https://use.typekit.net/qnx3faq.css');
-$primary-color: #2563eb;
+$primary-color: #15345e;
$secondary-color: #ffffff;
$tertiary-color: #e7e5e4;
$gray-color: #878787;
$hover-color: black;
$text-color-primary: #424242;
+$heading-color-primary: #171717;
+$alt-text-color-primary: #327ce0;
+$heading-color-primary: #424242;
+$heading-color-secondary: #404040;
$text-color-secondary: #707070;
-$divider-color: #E1E1E1;
+$divider-color: #e1e1e1;
+$divider-color-secondary: #bebebe;
+$background-color-secondary: #f4f8fc;
+$pagination-color-active: #327ce0;
+$pagination-color-disabled: #909090;
+$filter-button-background-color: #f5f5f5;
+$filter-button-background-color-active: #ebf2fc;
+$team-profile-text-color: #9e9e9e;
+$background-color-tertiary: #f5f5f5;
+$button-color-primary: #2e71cc;
+$primary-50: #ebf2fc;
+$navbar-text-color: #15345e;
+$navbar-active-text-color: #24589f;
+
+@mixin tablet {
+ @media only screen and (max-width: 1280px) {
+ @content;
+ }
+}
+
+@mixin mobile {
+ @media only screen and (max-width: 786px) {
+ @content;
+ }
+}
:root {
scroll-behavior: smooth;
@@ -26,8 +54,16 @@ body {
}
.page-heading {
- font-family: "Source Serif Pro";
font-size: 56px;
font-weight: 700;
letter-spacing: -1.12px;
+ color: $heading-color-primary;
+
+ @include tablet {
+ font-size: 44px;
+ }
+
+ &--secondary {
+ font-weight: 600;
+ }
}
diff --git a/src/app/join-us/join-us.scss b/src/app/join-us/join-us.scss
deleted file mode 100644
index f1c2623..0000000
--- a/src/app/join-us/join-us.scss
+++ /dev/null
@@ -1,101 +0,0 @@
-body {
- .container {
- display: flex;
- flex-direction: column;
- height: 100%;
- margin-top: 2%;
- }
- .sub-container-2-col {
- display: flex;
- direction: row;
- margin: 2em;
- align-items: center;
- justify-content: space-between;
- }
-
- .sub-header {
- font-size: 1.5rem;
- font-weight: 700;
- color: inherit;
- text-decoration: none;
- transition: opacity 0.25s ease-in-out;
- margin-bottom: 0.5rem;
- }
-
- .square {
- width: 1.5em;
- height: 1.5em;
- display: fixed;
- align-items: center;
- justify-content: center;
- font-size: 20px;
- background-color: #878787;
- }
- .box-size-30 {
- width: 30%;
- }
-
- .box-size-40 {
- width: 40%;
-
- &__center {
- @extend .box-size-40;
- align-self: center;
- }
- }
-
- .box-size-50 {
- width: 50%;
-
- &__marginX {
- @extend .box-size-50;
- margin-left: 2em;
- margin-right: 2em;
- }
- }
-
- .box-size-70 {
- width: 70%;
- }
-
- .box-number {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- }
-
- .link-no-decorated {
- text-decoration: none;
- }
-
- .divider {
- border-radius: 1;
- }
-
- .margin-left-1 {
- margin-left: 1em;
- }
-
- .margin-left-4 {
- margin-left: 4em;
- }
-
- .margin-bottom-4 {
- margin-bottom: 4em;
- }
-
- .display-flex {
- display: flex;
-
- &__center {
- @extend .display-flex;
- justify-content: center;
- }
-
- &__space-around {
- @extend .display-flex;
- justify-content: space-around;
- }
- }
-}
diff --git a/src/app/join-us/page.tsx b/src/app/join-us/page.tsx
deleted file mode 100644
index 62c2776..0000000
--- a/src/app/join-us/page.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-import CoreValues from '@/components/core-values/core-values';
-import FrequentlyAskedQuestions from '@/components/faq/faq';
-import { Box, Divider, Link, Paper, Typography } from '@mui/material';
-import Container from '@mui/material/Container';
-import Image from 'next/image';
-import React from 'react';
-import './join-us.scss';
-
-export default function JoinUs() {
- return (
-
-
-
-
-
-
-
- Our Mission
-
-
- At OpenBC, we're passionate about leveraging your unique
- abilities for the advancement of our province.
-
-
-
- Contribute to Open Source Projects for BC, from Anywhere, with
- OpenBC.
-
-
-
-
-
-
- Visions
-
-
- Quis neque, eu et ipsum amet, vel et. Varius integer enim pellentesque
- ornare pharetra faucibs arcu. Mauris blandit egestas nibh. eu et ipsum
- amet, vel et. Varius integer enim pellentesque ornare pharetra faucibs
- arcu. Mauris blandit egestas nibh.
-
-
-
-
-
- Volunteers
-
-
- Be A Partner
-
-
-
-
-
-
-
-
- Ready to contribute to British Columbia through Open Source
- projects?
-
-
-
- Join us at OpenBC and become a part of our active and welcoming
- community.
-
-
-
-
-
-
- 1
-
-
-
- Tell Us About Yourself
-
-
-
- Fill out our 2 minute form so we can help match you with
- opportunities
-
-
-
-
- 2
-
-
-
- Onboarding
-
-
-
- Tortor interdumd pulvinar risus. Cursus in odio aenean.
-
-
-
-
- 3
-
-
-
- Have a question?
-
-
-
- Find you answers in FAQ or email{' '}
-
- openbc.ca AT gmail.com
- {' '}
- with any questions or feedback.
-
-
-
-
- Core Values
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 4aa47ff..4b3b0c2 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,23 +1,26 @@
import Footer from '@/components/footer/footer';
import Header from '@/components/header/header';
import { AppRouterCacheProvider } from '@mui/material-nextjs/v13-appRouter';
-import { Lato } from 'next/font/google';
+import { StyledEngineProvider } from '@mui/material/styles';
+import { Lexend } from 'next/font/google';
import React from 'react';
import './globals.scss';
-const lato = Lato({
+const lexend = Lexend({
subsets: ['latin'],
- weight: ['100', '300', '400', '700', '900'],
+ weight: ['100', '300', '400', '500', '700', '900'],
});
export default function RootLayout({ children }: any) {
return (
-
+
-
- {children}
-
+
+
+ {children}
+
+
diff --git a/src/app/our-team/our-team.page.test.tsx b/src/app/our-team/our-team.page.test.tsx
new file mode 100644
index 0000000..fbbdd42
--- /dev/null
+++ b/src/app/our-team/our-team.page.test.tsx
@@ -0,0 +1,12 @@
+import OurTeam from '@/app/our-team/page';
+import '@testing-library/jest-dom';
+import { render, screen } from '@testing-library/react';
+
+describe('Our Team Page', () => {
+ it('should render title', async () => {
+ // About is an async component, so we need to await it
+ render(await OurTeam());
+ const title = screen.getByRole('heading', { name: 'Meet Our Team' });
+ expect(title).toBeInTheDocument();
+ });
+});
diff --git a/src/app/our-team/our-team.scss b/src/app/our-team/our-team.scss
new file mode 100644
index 0000000..4a35774
--- /dev/null
+++ b/src/app/our-team/our-team.scss
@@ -0,0 +1,223 @@
+@use '../globals.scss' as *;
+
+.about-page {
+ padding-top: 6rem;
+ padding-bottom: 6rem;
+
+ @include tablet {
+ padding-top: 3rem;
+ padding-bottom: 3rem;
+ }
+
+ @include mobile {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+ }
+
+ &__heading-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 2rem;
+ width: 100%;
+ }
+
+ &__text {
+ font-size: 1.5rem;
+ text-align: center;
+ letter-spacing: -0.48px;
+ color: $text-color-primary;
+ font-family: inherit;
+
+ @include tablet {
+ font-size: 1.5rem;
+ }
+ }
+
+ &__content-container {
+ display: flex;
+ align-items: flex-start;
+ margin-top: 3.75rem;
+ gap: 5rem;
+
+ @include tablet {
+ flex-direction: column;
+ gap: 2rem;
+ }
+ }
+
+ &__content-wrapper {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ gap: 5rem;
+ width: 100%;
+ padding-bottom: 6rem;
+
+ @include tablet {
+ width: 100%;
+ align-items: center;
+ padding-bottom: 3rem;
+ }
+ }
+
+ &__filter {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 22px;
+
+ @include tablet {
+ flex-direction: row;
+ flex-wrap: wrap;
+ width: 100%;
+ }
+ }
+
+ &__filter-button {
+ padding: 0.5rem 1rem;
+ font-family: inherit;
+ font-weight: 600;
+ font-size: 1.25rem;
+ color: $text-color-secondary;
+ background-color: $filter-button-background-color;
+ border-radius: 12px;
+ white-space: nowrap;
+
+ &--active {
+ background-color: $filter-button-background-color-active;
+ color: $primary-color;
+ }
+ }
+
+ &__card-container {
+ display: flex;
+ align-items: center;
+ row-gap: 5rem;
+ column-gap: 1.75rem;
+ flex-wrap: wrap;
+
+ @include tablet {
+ width: 100%;
+ justify-content: center;
+ }
+
+ @include mobile {
+ flex-direction: column;
+ gap: 0px;
+ }
+ }
+
+ &__pagination {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .MuiPagination-ul {
+ li {
+ &:first-child {
+ margin-right: 5rem;
+
+ @include tablet {
+ margin-right: 2.5rem;
+ }
+
+ button {
+ color: $pagination-color-active;
+ }
+ }
+
+ &:last-child {
+ margin-left: 5rem;
+
+ @include tablet {
+ margin-left: 2.5rem;
+ }
+
+ button {
+ color: $pagination-color-active;
+ }
+ }
+
+ .MuiPaginationItem-root {
+ font-size: 1.125rem;
+ line-height: 1.5rem;
+ font-family: inherit;
+ color: $pagination-color-disabled;
+
+ @include tablet {
+ font-size: 1rem;
+ line-height: 1.25rem;
+ }
+
+ &.Mui-selected {
+ color: $pagination-color-active;
+ background-color: transparent;
+ }
+ }
+ }
+ }
+ }
+}
+
+.join-us-cta-card {
+ padding: 1.25rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1.5rem;
+ border-radius: 6px;
+ margin: 3.75rem auto 0;
+
+ @include mobile {
+ max-width: 100%;
+ margin: 2rem 0;
+ }
+
+ &__divider {
+ width: 50%;
+ height: 0;
+ border: 1.6px solid $divider-color-secondary;
+
+ @include mobile {
+ width: 100%;
+ }
+ }
+
+ &__text-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1rem;
+ text-align: center;
+ }
+
+ &__title {
+ color: $heading-color-primary;
+ font-family: inherit;
+ font-size: 1.75rem;
+ font-weight: 700;
+ letter-spacing: -0.48px;
+ }
+
+ &__text {
+ color: #575757;
+ font-family: inherit;
+ font-size: 1.25rem;
+ font-weight: 600;
+ }
+
+ &__button {
+ text-transform: none;
+ min-width: 200px;
+
+ @include mobile {
+ width: 100%;
+ }
+ }
+}
diff --git a/src/app/our-team/page.client.tsx b/src/app/our-team/page.client.tsx
new file mode 100644
index 0000000..d034152
--- /dev/null
+++ b/src/app/our-team/page.client.tsx
@@ -0,0 +1,155 @@
+'use client';
+import TeamBioCard from '@/components/team-bio-card/team-bio-card';
+import {
+ Box,
+ Button,
+ Pagination,
+ PaginationItem,
+ Typography,
+} from '@mui/material';
+import Container from '@mui/material/Container';
+import Script from 'next/script';
+import React, { useState } from 'react';
+import './our-team.scss';
+
+interface TeamMember {
+ name: string;
+ job_title: string;
+ bio?: string;
+ linkedin_link: string;
+ github_link?: string;
+ role: string[];
+ profile_image_link: string;
+ brief_descriptions?: string;
+}
+
+interface AboutPageProps {
+ teamMemberData: TeamMember[];
+}
+
+export default function About({ teamMemberData }: AboutPageProps) {
+ const roles = [
+ 'All Members',
+ 'Executive',
+ 'Product/UIUX',
+ 'Developers',
+ 'Business Development',
+ 'Data',
+ ];
+ const [filter, setFilter] = useState(roles[0]);
+ const [page, setPage] = useState(1);
+
+ const teamMemberJson = teamMemberData.map((teamMember: TeamMember) => ({
+ '@context': 'https://schema.org',
+ '@type': 'Person',
+ name: teamMember.name,
+ jobTitle: teamMember.job_title,
+ description: teamMember.bio || '',
+ url: 'https://www.codeforbc.ca/about',
+ image: teamMember.profile_image_link
+ ? `https://www.codeforbc.ca${teamMember.profile_image_link}`
+ : '',
+ sameAs: [teamMember.linkedin_link, teamMember.github_link || ''],
+ }));
+ const filterMembers = (role: string) => {
+ if (role === roles[0]) return teamMemberData;
+ return teamMemberData.filter((member) => member.role.includes(role));
+ };
+
+ const filteredMembers = filterMembers(filter);
+
+ const numberOfMembersToDisplay = 6;
+ const displayedMembers = filteredMembers.slice(
+ (page - 1) * numberOfMembersToDisplay,
+ page * numberOfMembersToDisplay
+ );
+ const totalPages = Math.ceil(
+ filteredMembers.length / numberOfMembersToDisplay
+ );
+
+ const formatPageNumber = (number: number | null) => {
+ if (number === null) return '00';
+ return number.toLocaleString('en-US', { minimumIntegerDigits: 2 });
+ };
+
+ const renderRoleButtons = roles.map((role) => (
+
+ ));
+
+ return (
+
+
+
+
+ Meet Our Team
+
+
+ We are volunteer developers, designers, project managers, engineers,
+ marketers, organizers, strategists, and citizens committed to our
+ vision, and driven by our mission.
+
+
+
+ {renderRoleButtons}
+
+
+ {displayedMembers.map((teamMember: TeamMember) => (
+
+ ))}
+
+ setPage(value)}
+ className="about-page__pagination"
+ variant="text"
+ size="large"
+ color="primary"
+ shape="rounded"
+ renderItem={(item) => (
+
+ )}
+ />
+
+
+
+
+
+
+ Want to be a part of our team?
+
+
+ Contribute to Rewarding Projects for BC, from Anywhere, with
+ CodeForBC.
+
+
+
+
+
+ );
+}
diff --git a/src/app/our-team/page.tsx b/src/app/our-team/page.tsx
new file mode 100644
index 0000000..65c96ad
--- /dev/null
+++ b/src/app/our-team/page.tsx
@@ -0,0 +1,16 @@
+import { getTeamMemberData } from '@/utils/get-team-members-data/get-team-members-data';
+import { Metadata } from 'next';
+import React from 'react';
+import './our-team.scss';
+import AboutClient from './page.client';
+
+export const metadata: Metadata = {
+ title: 'Meet Our Team | CodeForBC',
+ description:
+ 'Meet the team members driving innovation and community impact at CodeForBC.',
+};
+
+export default async function OurTeam() {
+ const teamMemberData = await getTeamMemberData();
+ return ;
+}
diff --git a/src/app/page.test.tsx b/src/app/page.test.tsx
index a8875ef..13f7da6 100644
--- a/src/app/page.test.tsx
+++ b/src/app/page.test.tsx
@@ -19,7 +19,7 @@ describe('Home component', () => {
});
it('checks metadata', () => {
- expect(metadata).toHaveProperty('title', 'Home | OpenBC');
+ expect(metadata).toHaveProperty('title', 'Home | CodeForBC');
expect(metadata).toHaveProperty(
'description',
'Be a Force for Good in BC!'
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 3906315..0bb5ed8 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,11 +1,46 @@
import { Metadata } from 'next';
+import Script from 'next/script';
import { HomePage } from './_component/home-page';
export const metadata: Metadata = {
- title: 'Home | OpenBC',
+ title: 'Home | CodeForBC',
description: 'Be a Force for Good in BC!',
};
export default function Home() {
- return ;
+ return (
+ <>
+
+
+
+ >
+ );
}
diff --git a/src/app/privacy-policy/page.tsx b/src/app/privacy-policy/page.tsx
new file mode 100644
index 0000000..a86c8be
--- /dev/null
+++ b/src/app/privacy-policy/page.tsx
@@ -0,0 +1,203 @@
+import { Box, Container, Typography } from '@mui/material';
+import Link from 'next/link';
+import React from 'react';
+import './privacy-policy.scss';
+
+export default function PrivacyPolicy() {
+ return (
+
+
+
+ Privacy Policy
+
+
+ Effective Date: 2024-05-29
+
+
+
+
+
+ 1. Introduction
+
+
+ CodeForBC ("we," "us," or "our") is
+ committed to protecting your privacy. This Privacy Policy explains
+ how we collect, use, disclose, and safeguard your personal
+ information when you visit our website https://www.codeforbc.ca and
+ use our services.
+
+
+
+
+ 2. Information We Collect
+
+
+ We may collect personal information about you in various ways,
+ including:
+
+
+
+ Personal Identification Information: Name, email address, phone
+ number, and mailing address.
+
+
+ Technical Data: IP address, browser type, operating system, and
+ website usage data collected through cookies and similar
+ technologies.
+
+
+
+
+ 3. How We Use Your Information
+
+
+ We use the collected information for the following purposes:
+
+
+
+
+
+ To provide, operate, and maintain our website and services.
+
+
+
+
+ To improve, personalize, and expand our website and services.
+
+
+
+
+ To communicate with you, including responding to your inquiries
+ and providing updates.
+
+
+
+
+ To process transactions and send related information.
+
+
+
+
+ To comply with legal obligations and protect our rights.
+
+
+
+
+
+
+ 4. Information Sharing and Disclosure
+
+
+ We do not sell, trade, or otherwise transfer your personal
+ information to outside parties except as described below:
+
+
+
+ Service Providers: We may share your information with third-party
+ service providers who assist us in operating our website, conducting
+ our business, or providing services to you, as long as these parties
+ agree to keep this information confidential.
+
+
+ Legal Requirements: We may disclose your information if required to
+ do so by law or in response to valid requests by public authorities
+ (e.g., a court or government agency).
+
+
+
+
+ 5. Data Security
+
+
+ We implement appropriate technical and organizational measures to
+ protect your personal information against unauthorized access,
+ disclosure, alteration, and destruction.
+
+
+
+
+ 6. Your Rights
+
+
+ You have the right to:
+
+
+
+
+
+ Access and receive a copy of your personal information.
+
+
+
+
+ Correct any inaccurate or incomplete personal information.
+
+
+
+
+ Request the deletion of your personal information.
+
+
+
+
+ Object to the processing of your personal information.
+
+
+
+
+ To exercise these rights, please contact us at
+ codeforbc@gmail.com.
+
+
+
+
+
+
+ 7. Cookies and Tracking Technologies
+
+
+ We use cookies and similar tracking technologies to track the
+ activity on our website and hold certain information. You can
+ instruct your browser to refuse all cookies or to indicate when a
+ cookie is being sent. However, if you do not accept cookies, you may
+ not be able to use some portions of our website.
+
+
+
+
+ 8. Changes to This Privacy Policy
+
+
+ We may update our Privacy Policy from time to time. We will notify
+ you of any changes by posting the new Privacy Policy on this page
+ and updating the effective date at the top.
+
+
+
+
+ 9. Contact Us
+
+
+ If you have any questions about this Privacy Policy, please contact
+ us at:
+
+
+
+ CodeForBC
+
+ Email:
+
+ codeforbc@gmail.com
+
+
+
+
+
+ );
+}
diff --git a/src/app/about/about.page.test.tsx b/src/app/privacy-policy/privacy-policy-page.test.tsx
similarity index 53%
rename from src/app/about/about.page.test.tsx
rename to src/app/privacy-policy/privacy-policy-page.test.tsx
index 736d21c..8d79c3e 100644
--- a/src/app/about/about.page.test.tsx
+++ b/src/app/privacy-policy/privacy-policy-page.test.tsx
@@ -1,12 +1,12 @@
+import PrivacyPolicy from '@/app/privacy-policy/page';
import '@testing-library/jest-dom';
import { render, screen } from '@testing-library/react';
import React from 'react';
-import About from '@/app/about/page';
-describe('About Page', () => {
+describe('Privacy Policy Page', () => {
it('should render title', () => {
- render();
- const title = screen.getByText('About');
+ render();
+ const title = screen.getByText('Privacy Policy');
expect(title).toBeInTheDocument();
});
});
diff --git a/src/app/privacy-policy/privacy-policy.scss b/src/app/privacy-policy/privacy-policy.scss
new file mode 100644
index 0000000..fad4d10
--- /dev/null
+++ b/src/app/privacy-policy/privacy-policy.scss
@@ -0,0 +1,72 @@
+@use '../globals.scss' as *;
+
+.privacy-page {
+ padding-top: 4rem;
+ padding-bottom: 4rem;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+
+ &__heading-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+ gap: 2rem;
+ }
+
+ &__heading {
+ font-family: inherit;
+ font-size: 2.75rem;
+ line-height: 3.4375rem;
+ font-weight: 600;
+ color: $heading-color-primary;
+ }
+
+ &__sub-heading {
+ font-family: inherit;
+ font-size: 1.125rem;
+ font-weight: 500;
+ line-height: 1.5rem;
+ color: $navbar-text-color;
+ }
+
+ &__content-container {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ }
+
+ &__content-item {
+ display: flex;
+ flex-direction: column;
+ }
+
+ &__title {
+ font-family: inherit;
+ font-size: 1.25rem;
+ font-weight: 700;
+ line-height: 1.875rem;
+ color: $navbar-text-color;
+ }
+
+ &__text {
+ font-family: inherit;
+ font-size: 1.25rem;
+ font-weight: 500;
+ line-height: 1.875rem;
+ color: $navbar-text-color;
+
+ &--email {
+ color: $button-color-primary;
+ text-decoration: none;
+ }
+ }
+
+ &__list {
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+}
diff --git a/src/app/projects/[project_id]/page.tsx b/src/app/projects/[project_id]/page.tsx
new file mode 100644
index 0000000..9518cb1
--- /dev/null
+++ b/src/app/projects/[project_id]/page.tsx
@@ -0,0 +1,183 @@
+import { Link as LinkInterface } from '@/app/dataModels/link';
+import { Project as ProjectInterface } from '@/app/dataModels/project';
+import { getLocalProjectData } from '@/utils/get-local-project-data/get-local-project-data';
+import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';
+import { Button } from '@mui/material';
+import Container from '@mui/material/Container';
+import Image from 'next/image';
+import Link from 'next/link';
+import { redirect } from 'next/navigation';
+import React from 'react';
+import './project.scss';
+
+export async function generateStaticParams() {
+ const allProjectData = await getLocalProjectData();
+
+ return Object.keys(allProjectData).map((projectDataKey: string) => ({
+ // project_id is snake_case because it needs to match the project_id
+ // naming of the directory in order for generateStaticParams to work
+ project_id: projectDataKey,
+ projectData: allProjectData[projectDataKey],
+ }));
+}
+
+function ProjectBanner(projectData: ProjectInterface) {
+ const { description, title, projectImage, status } = projectData;
+ return (
+
+