diff --git a/public/images/projects/duckbot.png b/public/images/projects/duckbot.png new file mode 100644 index 00000000..7143b87f Binary files /dev/null and b/public/images/projects/duckbot.png differ diff --git a/public/images/projects/website.png b/public/images/projects/website.png new file mode 100644 index 00000000..f6e3c2da Binary files /dev/null and b/public/images/projects/website.png differ diff --git a/src/app/open-source/ProjectCard.tsx b/src/app/open-source/ProjectCard.tsx new file mode 100644 index 00000000..59f8b471 --- /dev/null +++ b/src/app/open-source/ProjectCard.tsx @@ -0,0 +1,41 @@ +import Button from '@/components/Button'; +import FancyRectangle from '@/components/FancyRectangle'; +import type { Project } from '@/data/projects'; +import Image from 'next/image'; +import { FaGithub } from 'react-icons/fa'; + +export default function ProjectCard({ project }: { project: Project }) { + return ( + +
+ {`${project.title}`} +
+
+
+

+ {project.title} +

+

{project.description}

+
+
+ +
+
+
+ ); +} diff --git a/src/app/open-source/page.tsx b/src/app/open-source/page.tsx new file mode 100644 index 00000000..98fab51a --- /dev/null +++ b/src/app/open-source/page.tsx @@ -0,0 +1,98 @@ +import Title from '@/components/Title'; +import { PROJECTS } from '@/data/projects'; +import type { Metadata } from 'next'; +import ProjectCard from './ProjectCard'; + +export const metadata: Metadata = { + title: 'Open Source', +}; + +export default function OpenSourcePage() { + return ( +
+
+
+ Open Source +
+
+
+

Who is the Open Source Team?

+

+ The CS Club Open Source Team is a place for creative and inventive + students who want to build innovative open-source software together. We + are a new team currently working on a few projects, but we have many + more exciting projects planned for the future! +

+
+
+

Our Projects

+
+ {PROJECTS.map((project, i) => ( + + ))} +
+
+
+

How to join?

+

+ Looking to join an active and welcoming student developer community? + We're always on the lookout for enthusiastic and creative students + to join us, learn, and contribute to making useful open-source projects. + Join our team by filling out{' '} + + this Google Form + + . +

+
+
+

+ Contributing Guidelines & Code of Conduct +

+

+ The CS Club Open Source Team follows our{' '} + + Contributing Guidelines + {' '} + and{' '} + + Code of Conduct + + . +

+
+
+

Contact Us

+

+ The open-source managers are{' '} + + Phoenix Pereira + {' '} + and{' '} + + Justin Sun + + . +

+

+ If you have any queries, please contact us via{' '} + + dev@csclub.org.au + + . +

+
+
+
+
+ ); +} diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 1339ac22..aab82c7e 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -13,6 +13,7 @@ interface ButtonProps { loading?: boolean; size?: 'base' | 'small'; font?: string; + targetBlank?: boolean; } const Button = ({ @@ -25,6 +26,7 @@ const Button = ({ loading, font, size = 'base', + targetBlank = false, }: ButtonProps) => { const isAnchor = !!href; const Component = isAnchor ? 'a' : 'button'; @@ -35,7 +37,18 @@ const Button = ({ href={isAnchor ? href : undefined} onClick={onClick} type={isAnchor ? undefined : type} - className={`${width} ${font ?? 'text-lg md:text-base'} ${BG_COLOURS[colour]} ${isAnchor ? 'hover:bg-yellow' : 'hover:enabled:bg-yellow'} whitespace-nowrap border-2 border-black ${size == 'base' ? 'px-16 text-lg' : 'px-4 text-sm'} py-4 font-bold transition-colors duration-300 disabled:cursor-wait disabled:grayscale md:px-2 md:py-1 md:text-base lg:px-6 lg:py-2`} + target={isAnchor && targetBlank ? '_blank' : undefined} + rel={isAnchor && targetBlank ? 'noopener noreferrer' : undefined} + className={` + ${width} ${font ?? 'text-lg md:text-base'} ${BG_COLOURS[colour]} + ${isAnchor ? 'hover:bg-yellow' : 'hover:enabled:bg-yellow'} + whitespace-nowrap border-2 border-black + ${size === 'base' ? 'px-16 text-lg' : 'px-4 text-sm'} flex + items-center justify-center py-4 + font-bold transition-colors + duration-300 disabled:cursor-wait disabled:grayscale md:px-2 md:py-1 + md:text-base lg:px-6 lg:py-2 + `} disabled={loading} > {children} diff --git a/src/components/Header/components/Links.tsx b/src/components/Header/components/Links.tsx index c1cf14c0..6c6d31c6 100644 --- a/src/components/Header/components/Links.tsx +++ b/src/components/Header/components/Links.tsx @@ -31,18 +31,20 @@ export function MenuLinks({ data, onClick }: { data: HeaderData; onClick?: () => ); } -const LINKS = ['about', 'events', 'sponsors', 'contact']; +const LINKS = [ + { title: 'About', href: '/about' }, + { title: 'Events', href: '/events' }, + { title: 'Sponsors', href: '/sponsors' }, + { title: 'Open Source', href: '/open-source' }, + { title: 'Contact', href: '/contact' }, +]; + export function Links({ onClick }: { onClick?: () => void }) { return ( <> {LINKS.map((link, i) => ( - - {link} + + {link.title} ))} diff --git a/src/data/projects.ts b/src/data/projects.ts new file mode 100644 index 00000000..232ef8ab --- /dev/null +++ b/src/data/projects.ts @@ -0,0 +1,21 @@ +export interface Project { + title: string; + description: string; + image: string; + githubLink: string; +} + +export const PROJECTS: Project[] = [ + { + title: 'CS Club Website', + description: "The Computer Science Club's website.", + image: 'website.png', + githubLink: 'https://github.com/compsci-adl/website', + }, + { + title: 'DuckBot', + description: "A Discord bot for the CS Club's Discord Server.", + image: 'duckbot.png', + githubLink: 'https://github.com/compsci-adl/duckbot', + }, +];