diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..039f80d --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,10 @@ +name: CI Pipeline + +on: + pull_request: + branches: [main, develop] + +jobs: + format: + name: Code Format Check + uses: ./.github/workflows/format.yaml diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml new file mode 100644 index 0000000..b06073c --- /dev/null +++ b/.github/workflows/quality.yaml @@ -0,0 +1,26 @@ +name: Code Format Check + +on: + workflow_call: + +jobs: + format: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Run Prettier check + run: npx prettier --check . + + - name: Run Eslint Check + run: npx eslint . diff --git a/app/components/Countdown/index.jsx b/app/components/Countdown/index.jsx index 0c1a171..28b17c0 100644 --- a/app/components/Countdown/index.jsx +++ b/app/components/Countdown/index.jsx @@ -1,51 +1,63 @@ -'use client' +"use client"; -import { useEffect, useState } from 'react' +import { useEffect, useState } from "react"; export function Countdown({ registration }) { - - const [counter, setCounter] = useState(registration - new Date().getTime()) - const [mounted, setMounted] = useState(false) - - useEffect(() => { - setMounted(true) - setInterval(() => setCounter(registration - new Date().getTime()), 500); - }, []) - - - return mounted && ( -
-
- - {/* days */} -
-
-
-

{Math.max(0,Math.floor(counter / (1000 * 60 * 60 * 24)))}

-
- - {/* hours */} -
-
-
-

{Math.max(0,Math.floor((counter % (1000 * 60 * 60 * 24))) / (1000 * 60 * 60))}

-
- - {/* minutes */} -
-
-
-

{Math.max(0,Math.floor((counter % (1000 * 60 * 60)) / (1000 * 60)))}

-
- - {/* seconds */} -
-
-
-

{Math.max(0,Math.floor((counter % (1000 * 60)) / 1000))}

-
-
-
- - ) -} \ No newline at end of file + const [counter, setCounter] = useState(registration - new Date().getTime()); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + setInterval(() => setCounter(registration - new Date().getTime()), 500); + }, []); + + return ( + mounted && ( +
+
+ {/* days */} +
+
+
+

+ {Math.max(0, Math.floor(counter / (1000 * 60 * 60 * 24)))} +

+
+ + {/* hours */} +
+
+
+

+ {Math.max( + 0, + Math.floor(counter % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), + )} +

+
+ + {/* minutes */} +
+
+
+

+ {Math.max( + 0, + Math.floor((counter % (1000 * 60 * 60)) / (1000 * 60)), + )} +

+
+ + {/* seconds */} +
+
+
+

+ {Math.max(0, Math.floor((counter % (1000 * 60)) / 1000))} +

+
+
+
+ ) + ); +} diff --git a/app/components/Footer/index.jsx b/app/components/Footer/index.jsx index fa5a9e6..b3967f8 100644 --- a/app/components/Footer/index.jsx +++ b/app/components/Footer/index.jsx @@ -2,9 +2,11 @@ import Image from "next/image"; import Link from "next/link"; export function Footer() { - return ( -
-

test your limits, never stop

-
- ) -} \ No newline at end of file + return ( +
+

+ test your limits, never stop +

+
+ ); +} diff --git a/app/components/General/DocumentCard/index.jsx b/app/components/General/DocumentCard/index.jsx index a749710..7302141 100644 --- a/app/components/General/DocumentCard/index.jsx +++ b/app/components/General/DocumentCard/index.jsx @@ -2,19 +2,27 @@ import Image from "next/image"; import Link from "next/link"; export function DocumentCard({ document }) { - return ( - + return ( + +
-
+
+ {document.name} -
- {document.name} - -

{document.name}

-

{document.description}

-
- - - - ) -} \ No newline at end of file +

+ {document.name} +

+

{document.description}

+
+ + ); +} diff --git a/app/components/General/Popup/Popup.module.css b/app/components/General/Popup/Popup.module.css index 8a00e9f..b9dac49 100644 --- a/app/components/General/Popup/Popup.module.css +++ b/app/components/General/Popup/Popup.module.css @@ -1,103 +1,103 @@ .container { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - padding-top: 5%; - padding-bottom: 5%; - z-index: 100; - background-color: rgba(0, 0, 0, 0.5); - animation: popupContainerEnter 0.4s forwards; + width: 100vw; + height: 100vh; + position: fixed; + top: 0; + left: 0; + padding-top: 5%; + padding-bottom: 5%; + z-index: 100; + background-color: rgba(0, 0, 0, 0.5); + animation: popupContainerEnter 0.4s forwards; } .containerSmall { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - padding-top: 5%; - padding-bottom: 5%; - z-index: 100; - background-color: rgba(0, 0, 0, 0.5); - animation: popupContainerEnter 0.4s forwards; + width: 100vw; + height: 100vh; + position: fixed; + top: 0; + left: 0; + padding-top: 5%; + padding-bottom: 5%; + z-index: 100; + background-color: rgba(0, 0, 0, 0.5); + animation: popupContainerEnter 0.4s forwards; } .containerLarge { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - padding-top: 5%; - padding-bottom: 5%; - z-index: 100; - background-color: rgba(0, 0, 0, 0.5); - animation: popupContainerEnter 0.4s forwards; + width: 100vw; + height: 100vh; + position: fixed; + top: 0; + left: 0; + padding-top: 5%; + padding-bottom: 5%; + z-index: 100; + background-color: rgba(0, 0, 0, 0.5); + animation: popupContainerEnter 0.4s forwards; } .popup { - position: relative; - background-color: var(--default-fg-colour); - padding: 30px; - border-radius: 15px; - max-height: 100%; - margin: auto; - box-shadow: var(--default-box-shadow); - overflow-y: auto; - animation: popupEnter 0.4s forwards; + position: relative; + background-color: var(--default-fg-colour); + padding: 30px; + border-radius: 15px; + max-height: 100%; + margin: auto; + box-shadow: var(--default-box-shadow); + overflow-y: auto; + animation: popupEnter 0.4s forwards; } .container .popup { - max-width: 600px; + max-width: 600px; } .containerSmall .popup { - max-width: 350px; + max-width: 350px; } .containerLarge .popup { - max-width: 850px; + max-width: 850px; } .close { - position: absolute; - top: 12px; - right: 12px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - padding: 4px; - border-radius: 50%; - border: none; - font-size: 1.2rem; - width: 2rem; - height: 2rem; - transition: 0.2s; + position: absolute; + top: 12px; + right: 12px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + padding: 4px; + border-radius: 50%; + border: none; + font-size: 1.2rem; + width: 2rem; + height: 2rem; + transition: 0.2s; } .close:hover { - background-color: rgb(240, 240, 240); + background-color: rgb(240, 240, 240); } @keyframes popupEnter { - from { - opacity: 0; - transform: translateY(35px) scale(0.95); - } - to { - opacity: 1; - transform: translateY(0) scale(1); - } + from { + opacity: 0; + transform: translateY(35px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } } @keyframes popupContainerEnter { - from { - background-color: rgba(0, 0, 0, 0); - } - to { - background-color: rgba(0, 0, 0, 0.5); - } -} \ No newline at end of file + from { + background-color: rgba(0, 0, 0, 0); + } + to { + background-color: rgba(0, 0, 0, 0.5); + } +} diff --git a/app/components/General/Popup/index.jsx b/app/components/General/Popup/index.jsx index d0e216f..f11e380 100644 --- a/app/components/General/Popup/index.jsx +++ b/app/components/General/Popup/index.jsx @@ -1,32 +1,39 @@ -'use client' +"use client"; -import { IoCloseSharp } from "react-icons/io5" +import { IoCloseSharp } from "react-icons/io5"; -import styles from "./Popup.module.css" -import { useRef } from "react" +import styles from "./Popup.module.css"; +import { useRef } from "react"; +export function Popup({ trigger, setTrigger, size = "medium", children }) { + const wrapper = useRef(); -export function Popup({ trigger, setTrigger, size="medium", children }) { - - const wrapper = useRef() - - return trigger ? ( -
{ - if(e.target === wrapper.current) { - setTrigger(false) - } - }} className={size === "small" ? styles.containerSmall : size === "medium" ? styles.container : size === "large" ? styles.containerLarge : styles.container }> -
- - {children} -
-
- ) : ( - <> - ) -} \ No newline at end of file + return trigger ? ( +
{ + if (e.target === wrapper.current) { + setTrigger(false); + } + }} + className={ + size === "small" + ? styles.containerSmall + : size === "medium" + ? styles.container + : size === "large" + ? styles.containerLarge + : styles.container + } + > +
+ + {children} +
+
+ ) : ( + <> + ); +} diff --git a/app/components/General/SouthWestImage/index.jsx b/app/components/General/SouthWestImage/index.jsx index 24d362b..e8c576b 100644 --- a/app/components/General/SouthWestImage/index.jsx +++ b/app/components/General/SouthWestImage/index.jsx @@ -1,11 +1,18 @@ import Image from "next/image"; export function SouthWestImage() { - return ( - <> -

* use desktop for best experience

- not found - - - ) -} \ No newline at end of file + return ( + <> +

+ * use desktop for best experience +

+ not found + + ); +} diff --git a/app/components/General/Sponsor/Card/index.jsx b/app/components/General/Sponsor/Card/index.jsx index 8a79371..511c683 100644 --- a/app/components/General/Sponsor/Card/index.jsx +++ b/app/components/General/Sponsor/Card/index.jsx @@ -1,32 +1,35 @@ -"use client" -import Image from "next/image" -import dynamic from "next/dynamic" +"use client"; +import Image from "next/image"; +import dynamic from "next/dynamic"; -const PinContainer = dynamic(() => import("@/app/components/ui/3d-pin").then((m) => m.PinContainer), { - ssr: false -}) +const PinContainer = dynamic( + () => import("@/app/components/ui/3d-pin").then((m) => m.PinContainer), + { + ssr: false, + }, +); export default function SponsorCard({ sName, sSite, sImage, sLevel }) { - return ( -
- -
-

{sName}

-
- {sName} -
-
-
-
- ) + return ( +
+ +
+

+ {sName} +

+
+ {sName} +
+
+
+
+ ); } diff --git a/app/components/General/Sponsor/index.jsx b/app/components/General/Sponsor/index.jsx index 6da1501..a165722 100644 --- a/app/components/General/Sponsor/index.jsx +++ b/app/components/General/Sponsor/index.jsx @@ -1,86 +1,88 @@ -"use client" +"use client"; -import SponsorCard from "./Card" +import SponsorCard from "./Card"; const info = { - liminal: { - name: "Liminal", - image: "/images/sponsors/liminal.png", - site: "https://www.liminal.ai", - level: "gold", - }, - southwestcybersecuritycluster: { - name: "South West Cyber Security Cluster", - image: "/images/sponsors/swcsc.png", - site: "https://southwestcsc.org/", - level: "silver", - }, - rootmepro: { - name: "Root Me Pro", - image: "/images/sponsors/rootmepro.png", - site: "https://pro.root-me.org/", - level: "silver", - }, - hh: { - name: "Hacking Hub", - image: "/images/sponsors/HackingHub.svg", - site: "https://www.hackinghub.io/", - level: "silver", - }, - mintsw: { - name: "Mint South West", - image: "/images/sponsors/mintsw.png", - site: "https://www.mrwedge.co.uk/mintsw", - level: "silver", - }, - superteam: { - name: "SuperTeam", - image: "/images/sponsors/superteam.png", - site: "https://superteam.fun/", - level: "bronze", - }, - solana: { - name: "Solana", - image: "/images/sponsors/solana.png", - site: "https://www.solana.com/", - level: "bronze", - }, - checkout: { - name: "Checkout.com", - image: "/images/sponsors/checkout.jpeg", - site: "https://www.checkout.com/", - level: "bronze", - }, - dora: { - name: "Dora Hacks", - image: "/images/sponsors/dora.png", - site: "https://www.dorahacks.com/", - level: "bronze", - }, - excs: { - name: "Computer Science Society", - image: "/images/sponsors/excs.svg", - site: "https://excs.uk/", - level: "bronze", - }, - cybersoc: { - name: "Cyber Security Society", - image: "/images/sponsors/cybersoc.png", - site: "https://my.exeterguild.com/groups/TT2W9/cyber-security-society", - level: "bronze", - } -} + liminal: { + name: "Liminal", + image: "/images/sponsors/liminal.png", + site: "https://www.liminal.ai", + level: "gold", + }, + southwestcybersecuritycluster: { + name: "South West Cyber Security Cluster", + image: "/images/sponsors/swcsc.png", + site: "https://southwestcsc.org/", + level: "silver", + }, + rootmepro: { + name: "Root Me Pro", + image: "/images/sponsors/rootmepro.png", + site: "https://pro.root-me.org/", + level: "silver", + }, + hh: { + name: "Hacking Hub", + image: "/images/sponsors/HackingHub.svg", + site: "https://www.hackinghub.io/", + level: "silver", + }, + mintsw: { + name: "Mint South West", + image: "/images/sponsors/mintsw.png", + site: "https://www.mrwedge.co.uk/mintsw", + level: "silver", + }, + superteam: { + name: "SuperTeam", + image: "/images/sponsors/superteam.png", + site: "https://superteam.fun/", + level: "bronze", + }, + solana: { + name: "Solana", + image: "/images/sponsors/solana.png", + site: "https://www.solana.com/", + level: "bronze", + }, + checkout: { + name: "Checkout.com", + image: "/images/sponsors/checkout.jpeg", + site: "https://www.checkout.com/", + level: "bronze", + }, + dora: { + name: "Dora Hacks", + image: "/images/sponsors/dora.png", + site: "https://www.dorahacks.com/", + level: "bronze", + }, + excs: { + name: "Computer Science Society", + image: "/images/sponsors/excs.svg", + site: "https://excs.uk/", + level: "bronze", + }, + cybersoc: { + name: "Cyber Security Society", + image: "/images/sponsors/cybersoc.png", + site: "https://my.exeterguild.com/groups/TT2W9/cyber-security-society", + level: "bronze", + }, +}; export default function Sponsor() { - const sponsors = Object.values(info) + const sponsors = Object.values(info); - return ( -
-

Meet the Sponsors

+ return ( +
+

+ Meet the Sponsors +

-
-
+
- {sponsors.map((s, index) => ( - - ))} -
-
-
- ) + > + {sponsors.map((s, index) => ( + + ))} +
+
+ + ); } diff --git a/app/components/Loading/Loading.module.css b/app/components/Loading/Loading.module.css index 7ce988a..92f986c 100644 --- a/app/components/Loading/Loading.module.css +++ b/app/components/Loading/Loading.module.css @@ -1,27 +1,27 @@ .wrapper { - padding: 10%; - display: flex; - justify-content: center; - align-items: center; + padding: 10%; + display: flex; + justify-content: center; + align-items: center; } .inner { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 24px; - animation: enter 0.4s forwards; - max-width: 400px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 24px; + animation: enter 0.4s forwards; + max-width: 400px; } @keyframes enter { - from { - transform: scale(0.5); - opacity: 0; - } - to { - transform: scale(1); - opacity: 1; - } -} \ No newline at end of file + from { + transform: scale(0.5); + opacity: 0; + } + to { + transform: scale(1); + opacity: 1; + } +} diff --git a/app/components/Loading/index.jsx b/app/components/Loading/index.jsx index f87e5e1..4996418 100644 --- a/app/components/Loading/index.jsx +++ b/app/components/Loading/index.jsx @@ -1,17 +1,21 @@ -import { HashLoader } from "react-spinners" -import styles from "./Loading.module.css" +import { HashLoader } from "react-spinners"; +import styles from "./Loading.module.css"; /** * A standard component to be used when something is loading on the screen * @param {String} size can be large or small (large by default). When small icon is smaller and message is not shown */ -export function Loading({ size="large", color="white", message="Loading..." }) { - return ( -
-
- -

{message}

-
-
- ) -} \ No newline at end of file +export function Loading({ + size = "large", + color = "white", + message = "Loading...", +}) { + return ( +
+
+ +

{message}

+
+
+ ); +} diff --git a/app/components/Question/index.jsx b/app/components/Question/index.jsx index 01edcfc..bb476e4 100644 --- a/app/components/Question/index.jsx +++ b/app/components/Question/index.jsx @@ -1,29 +1,33 @@ -'use client' +"use client"; import { useState } from "react"; import { IoIosArrowDown } from "react-icons/io"; export function Question({ info }) { + const [open, setOpen] = useState(false); - const [open, setOpen] = useState(false) + return ( +
setOpen(!open)} + > +
+

{info.question}

+ {open ? ( + + ) : ( + + )} +
- return ( -
setOpen(!open)}> -
-

{info.question}

- { open ? : } -
+ {open && ( +
+

{info.answer}

+
+ )} - { - open && ( -
-

{info.answer}

-
- ) - } - - {/*

{q.answer}

*/} -
-
- ) -} \ No newline at end of file + {/*

{q.answer}

*/} +
+
+ ); +} diff --git a/app/components/RegistrationButton/index.jsx b/app/components/RegistrationButton/index.jsx index f125114..7cb1ad2 100644 --- a/app/components/RegistrationButton/index.jsx +++ b/app/components/RegistrationButton/index.jsx @@ -1,29 +1,38 @@ -import Link from 'next/link'; +import Link from "next/link"; -export function RegistrationButton({ registration_open, registration_closed, force=false }) { - - return ( - <> - { - // is registration link available yet - (registration_open - new Date().getTime() < 0) && (!force) ? ( - <> - { - (registration_closed - new Date().getTime() > 0) ? ( - -

Register Now

- - ) : ( -
-

Closed

-
- ) - } - - ) : ( - - ) - } - - ) -} \ No newline at end of file +export function RegistrationButton({ + registration_open, + registration_closed, + force = false, +}) { + return ( + <> + { + // is registration link available yet + registration_open - new Date().getTime() < 0 && !force ? ( + <> + {registration_closed - new Date().getTime() > 0 ? ( + +

+ Register Now +

+ + ) : ( +
+

Closed

+
+ )} + + ) : ( + + ) + } + + ); +} diff --git a/app/components/Team/Profiles/index.jsx b/app/components/Team/Profiles/index.jsx index d2ff787..6205877 100644 --- a/app/components/Team/Profiles/index.jsx +++ b/app/components/Team/Profiles/index.jsx @@ -1,5 +1,5 @@ -import Image from "next/image" -import Link from "next/link" +import Image from "next/image"; +import Link from "next/link"; // icons import { VscGithubAlt } from "react-icons/vsc"; @@ -7,118 +7,207 @@ import { CiLinkedin } from "react-icons/ci"; import { IoIosLink } from "react-icons/io"; import { useEffect, useState } from "react"; - - -export function Profile({ name, position, description, image, github = "", linkedin = "", website = "", cybersoc = false, easter_egg = false, cover = false }) { - const [lastTouched, setLastTouched] = useState(new Date().getTime()); - - // TODO: remove, do we still need Easter egg? - useEffect(() => { - const interval = setInterval(() => { - const currentTime = new Date().getTime(); - if (currentTime - lastTouched > 5000) { - if (currentTime - lastTouched < 6000) { - setLastTouched(currentTime); - console.log("resetting") - } - } - }, 500) - - return () => clearInterval(interval); - }, []) - - return !easter_egg ? ( -
-
- -
- -
- name -
- -
-
-

{name}

-

{position}

-

{description}

-
- -
- {cybersoc && } - {github !== "" && } - {linkedin !== "" && } - {website !== "" && } -
-
-
-
- ) : ( -
-
- -
- -
- not found -
- -
-
-

{name}

-

{position}

-

{description}

-
- -
- { - console.log("enter") - // set the timer - setLastTouched(new Date().getTime()); - - // get the div - const div = document.getElementById("git"); - - // get the centre of the div - const rect = div.getBoundingClientRect(); - console.log(rect) - const centerX = rect.x + rect.width / 2; - const centerY = rect.y + rect.height / 2; - - // console.log(centerX, centerY); - - // get the mouse position - const mouseX = window.event.clientX; - const mouseY = window.event.clientY; - - // get the distance between the mouse and the centre of the div - const distanceX = mouseX - centerX; - const distanceY = mouseY - centerY; - // console.log(distanceX, distanceY); - - // get the angle - const angle = Math.atan2(distanceY, distanceX); - // console.log(angle); - // get the new position - let x = Math.sin(-angle - 1.5) * 100; - let y = Math.cos(-angle - 1.5) * 100; - // console.log(x) - - // check if the bounds exceed the screen - if (centerX + x < 0) x = 100; - if (centerY + y < 200) y = 500; - if (centerX + x > window.innerWidth) x = window.innerWidth - 100; - if (centerY + y > window.innerHeight) y = window.innerHeight - 100; - - div.style.transform = `translate(${x}px, ${y}px)`; - - - }}> - {linkedin !== "" && } - {website !== "" && } -
-
-
-
- ) -} \ No newline at end of file +export function Profile({ + name, + position, + description, + image, + github = "", + linkedin = "", + website = "", + cybersoc = false, + easter_egg = false, + cover = false, +}) { + const [lastTouched, setLastTouched] = useState(new Date().getTime()); + + // TODO: remove, do we still need Easter egg? + useEffect(() => { + const interval = setInterval(() => { + const currentTime = new Date().getTime(); + if (currentTime - lastTouched > 5000) { + if (currentTime - lastTouched < 6000) { + setLastTouched(currentTime); + console.log("resetting"); + } + } + }, 500); + + return () => clearInterval(interval); + }, []); + + return !easter_egg ? ( +
+
+
+ +
+ name +
+ +
+
+

+ {name} +

+

{position}

+

{description}

+
+ +
+ {cybersoc && ( + + + + )} + {github !== "" && ( + + + + )} + {linkedin !== "" && ( + + + + )} + {website !== "" && ( + + + + )} +
+
+
+
+ ) : ( +
+
+
+ +
+ not found +
+ +
+
+

+ {name} +

+

{position}

+

{description}

+
+ +
+ { + console.log("enter"); + // set the timer + setLastTouched(new Date().getTime()); + + // get the div + const div = document.getElementById("git"); + + // get the centre of the div + const rect = div.getBoundingClientRect(); + console.log(rect); + const centerX = rect.x + rect.width / 2; + const centerY = rect.y + rect.height / 2; + + // console.log(centerX, centerY); + + // get the mouse position + const mouseX = window.event.clientX; + const mouseY = window.event.clientY; + + // get the distance between the mouse and the centre of the div + const distanceX = mouseX - centerX; + const distanceY = mouseY - centerY; + // console.log(distanceX, distanceY); + + // get the angle + const angle = Math.atan2(distanceY, distanceX); + // console.log(angle); + // get the new position + let x = Math.sin(-angle - 1.5) * 100; + let y = Math.cos(-angle - 1.5) * 100; + // console.log(x) + + // check if the bounds exceed the screen + if (centerX + x < 0) x = 100; + if (centerY + y < 200) y = 500; + if (centerX + x > window.innerWidth) + x = window.innerWidth - 100; + if (centerY + y > window.innerHeight) + y = window.innerHeight - 100; + + div.style.transform = `translate(${x}px, ${y}px)`; + }} + > + + + {linkedin !== "" && ( + + + + )} + {website !== "" && ( + + + + )} +
+
+
+
+ ); +} diff --git a/app/components/TopBar/index.jsx b/app/components/TopBar/index.jsx index 1acef7e..b0ea746 100644 --- a/app/components/TopBar/index.jsx +++ b/app/components/TopBar/index.jsx @@ -2,35 +2,45 @@ import Image from "next/image"; import Link from "next/link"; export function TopBar() { - return ( -
-
-
-

1.

- HSW 2024 -
- -
-

2.

- Terms & Conditions -
- -
-

3.

- Intellectual Property -
- -
- -
- - not found - -
- - - - -
- ) -} \ No newline at end of file + return ( +
+
+
+

1.

+ + HSW 2024 + +
+ +
+

2.

+ + Terms & Conditions + +
+ +
+

3.

+ + Intellectual Property + +
+
+ +
+ + not found + +
+
+ ); +} diff --git a/app/components/ui/3d-pin.jsx b/app/components/ui/3d-pin.jsx index 39f8d99..96fe166 100644 --- a/app/components/ui/3d-pin.jsx +++ b/app/components/ui/3d-pin.jsx @@ -9,31 +9,31 @@ export const PinContainer = ({ href, className, containerClassName, - sLevel="default", + sLevel = "default", }) => { const [transform, setTransform] = useState( - "translate(-50%,-50%) rotateX(0deg)" + "translate(-50%,-50%) rotateX(0deg)", ); const onMouseEnter = () => { setTransform("translate(-50%,-50%) rotateX(40deg) scale(0.8)"); }; - + const onMouseLeave = () => { setTransform("translate(-50%,-50%) rotateX(0deg) scale(1)"); }; // Define shadow classes based on sponsor level const getShadowClass = () => { - switch(sLevel) { - case 'gold': - return 'group-hover/pin:drop-shadow-lg group-hover/pin:shadow-yellow-400/60'; - case 'silver': - return 'group-hover/pin:drop-shadow-lg group-hover/pin:shadow-slate-300/70'; - case 'bronze': - return 'group-hover/pin:drop-shadow-lg group-hover/pin:shadow-orange-600/60'; + switch (sLevel) { + case "gold": + return "group-hover/pin:drop-shadow-lg group-hover/pin:shadow-yellow-400/60"; + case "silver": + return "group-hover/pin:drop-shadow-lg group-hover/pin:shadow-slate-300/70"; + case "bronze": + return "group-hover/pin:drop-shadow-lg group-hover/pin:shadow-orange-600/60"; default: - return 'group-hover/pin:drop-shadow-lg group-hover/pin:shadow-slate-500/50'; + return "group-hover/pin:drop-shadow-lg group-hover/pin:shadow-slate-500/50"; } }; @@ -41,7 +41,7 @@ export const PinContainer = ({
{children}
@@ -163,4 +163,4 @@ export const PinPerspective = ({ title, href }) => {
); -}; \ No newline at end of file +}; diff --git a/app/components/ui/lib/utils.js b/app/components/ui/lib/utils.js index c3f5c1c..378ccef 100644 --- a/app/components/ui/lib/utils.js +++ b/app/components/ui/lib/utils.js @@ -3,4 +3,4 @@ import { twMerge } from "tailwind-merge"; export function cn(...inputs) { return twMerge(clsx(inputs)); -} \ No newline at end of file +} diff --git a/app/conditions/intellectual/page.jsx b/app/conditions/intellectual/page.jsx index faf6bfb..af77caf 100644 --- a/app/conditions/intellectual/page.jsx +++ b/app/conditions/intellectual/page.jsx @@ -1,74 +1,109 @@ export default function intellectual() { - return ( -
-
-

Intellectual Property

+ return ( +
+
+

+ Intellectual Property +

-
-

- Ownership: All intellectual property developed during Hack South West will be owned by - the original creators or their respective organisations, unless otherwise agreed upon by all - parties involved -

+
+

+ + Ownership: + {" "} + All intellectual property developed during Hack South West will be + owned by the original creators or their respective organisations, + unless otherwise agreed upon by all parties involved +

-

- Individual Ownership Participants retain full ownership and control over the intellectual - property rights to their creations, including but not limited to software, hardware, designs, - algorithms, and any other original works developed during the hackathon. -

+

+ + Individual Ownership + {" "} + Participants retain full ownership and control over the intellectual + property rights to their creations, including but not limited to + software, hardware, designs, algorithms, and any other original + works developed during the hackathon. +

-

- Team Ownership In the case of team-based projects, the ownership of intellectual - property rights will be jointly owned by all members of the team, unless otherwise agreed - upon by the team members. It is the responsibility of the team to establish clear agreements - regarding the ownership and use of intellectual property rights among team members -

+

+ + Team Ownership + {" "} + In the case of team-based projects, the ownership of intellectual + property rights will be jointly owned by all members of the team, + unless otherwise agreed upon by the team members. It is the + responsibility of the team to establish clear agreements regarding + the ownership and use of intellectual property rights among team + members +

-

- Third-Party Assets Participants are responsible for ensuring that they have the - necessary rights, licences, or permissions to use any third-party assets, including but not - limited to code libraries, APIs, data sets, and software tools, in their projects. Participants - must adhere to the terms of use and licensing agreements associated with third-party assets - and respect the intellectual property rights of their respective owners -

+

+ + Third-Party Assets + {" "} + Participants are responsible for ensuring that they have the + necessary rights, licences, or permissions to use any third-party + assets, including but not limited to code libraries, APIs, data + sets, and software tools, in their projects. Participants must + adhere to the terms of use and licensing agreements associated with + third-party assets and respect the intellectual property rights of + their respective owners +

-

- Open Source and Licensing Participants are encouraged to consider open-source - licensing for their projects to promote collaboration, transparency, and innovation within the - hackathon community. By default, participants should assume that their projects will be - made publicly available following the hackathon, unless they explicitly specify otherwise. -

+

+ + Open Source and Licensing + {" "} + Participants are encouraged to consider open-source licensing for + their projects to promote collaboration, transparency, and + innovation within the hackathon community. By default, participants + should assume that their projects will be made publicly available + following the hackathon, unless they explicitly specify otherwise. +

-

- Confidential Information Participants are expected to respect the confidentiality of any - sensitive or proprietary information shared during the hackathon, including but not limited to - trade secrets, business plans, and proprietary algorithms. Participants should not disclose or - use confidential information without permission from the rightful owner. -

+

+ + Confidential Information + {" "} + Participants are expected to respect the confidentiality of any + sensitive or proprietary information shared during the hackathon, + including but not limited to trade secrets, business plans, and + proprietary algorithms. Participants should not disclose or use + confidential information without permission from the rightful owner. +

-

- Dispute Resolution In the event of any disputes or disagreements regarding intellectual - property rights, participants are encouraged to resolve the matter amicably through mutual - discussion and negotiation. If a resolution cannot be reached, the organisers may provide - mediation or arbitration services to facilitate a fair and equitable resolution. -

+

+ + Dispute Resolution + {" "} + In the event of any disputes or disagreements regarding intellectual + property rights, participants are encouraged to resolve the matter + amicably through mutual discussion and negotiation. If a resolution + cannot be reached, the organisers may provide mediation or + arbitration services to facilitate a fair and equitable resolution. +

-

- Organiser Rights The organisers of Hack South West reserve the right to use, - reproduce, modify, adapt, and distribute any materials, including project submissions, for - promotional, educational, or other non-commercial purposes related to the hackathon, - provided that proper attribution is given to the original creators. +

+ + Organiser Rights + {" "} + The organisers of Hack South West reserve the right to use, + reproduce, modify, adapt, and distribute any materials, including + project submissions, for promotional, educational, or other + non-commercial purposes related to the hackathon, provided that + proper attribution is given to the original creators. +

-

- -

- By participating in Hack South West, you acknowledge that you have read, understood, and - agree to abide by these intellectual property rules. If you have any questions or concerns - regarding intellectual property rights, please consult with the organisers for clarification -

-
- -
-
- ) -} \ No newline at end of file +

+ By participating in Hack South West, you acknowledge that you have + read, understood, and agree to abide by these intellectual property + rules. If you have any questions or concerns regarding intellectual + property rights, please consult with the organisers for + clarification +

+
+
+
+ ); +} diff --git a/app/conditions/page.jsx b/app/conditions/page.jsx index 0ff8fc9..123d64d 100644 --- a/app/conditions/page.jsx +++ b/app/conditions/page.jsx @@ -1,36 +1,32 @@ -import { DocumentCard } from "../components/General/DocumentCard" +import { DocumentCard } from "../components/General/DocumentCard"; export default function DocumentsPage() { + const documents = [ + { + name: "Terms & Conditions", + description: "The terms and conditions of the event", + image: "/images/terms/terms.jpg", + link: "/conditions/terms", + }, + { + name: "Intellectual Property", + description: "The intellectual property rights of the event", + image: "/images/terms/intellectual.jpg", + link: "/conditions/intellectual", + }, + ]; - const documents = [ - { - name: "Terms & Conditions", - description: "The terms and conditions of the event", - image: "/images/terms/terms.jpg", - link: "/conditions/terms" - }, - { - name: "Intellectual Property", - description: "The intellectual property rights of the event", - image: "/images/terms/intellectual.jpg", - link: "/conditions/intellectual" - } - ] + return ( +
+
+

Documents Page

- return ( -
-
- -

Documents Page

- -
- { - documents.map((doc, index) => ( - - )) - } -
-
-
- ) -} \ No newline at end of file +
+ {documents.map((doc, index) => ( + + ))} +
+
+
+ ); +} diff --git a/app/conditions/terms/page.jsx b/app/conditions/terms/page.jsx index 0e47066..e9479ee 100644 --- a/app/conditions/terms/page.jsx +++ b/app/conditions/terms/page.jsx @@ -1,75 +1,105 @@ export default function terms() { - return ( -
-
-

Terms & Conditions

+ return ( +
+
+

+ Terms & Conditions +

-
-

- Respect Treat all participants, organisers, sponsors, mentors, and judges with respect - and consideration. Be mindful of your words and actions, and avoid behaviour that could be - perceived as disrespectful, derogatory, or offensive. -

+
+

+ Respect{" "} + Treat all participants, organisers, sponsors, mentors, and judges + with respect and consideration. Be mindful of your words and + actions, and avoid behaviour that could be perceived as + disrespectful, derogatory, or offensive. +

-

- Inclusivity Embrace diversity and inclusivity in all its forms, including but not limited to - race, ethnicity, gender identity, sexual orientation, disability, religion, nationality, age, and - socioeconomic status. Be welcoming and supportive of all participants, regardless of - background or experience level. -

+

+ + Inclusivity + {" "} + Embrace diversity and inclusivity in all its forms, including but + not limited to race, ethnicity, gender identity, sexual orientation, + disability, religion, nationality, age, and socioeconomic status. Be + welcoming and supportive of all participants, regardless of + background or experience level. +

-

- Harassment-Free Environment Harassment and discrimination have no place at Hack - South West. Harassment includes, but is not limited to: offensive verbal comments, - deliberate intimidation, stalking, following, harassing photography or recording, sustained - disruption of talks or other events, inappropriate physical contact, and unwelcome sexual - attention. If you are asked to stop any harassing behaviour, you are expected to comply - immediately. -

+

+ + Harassment-Free Environment + {" "} + Harassment and discrimination have no place at Hack South West. + Harassment includes, but is not limited to: offensive verbal + comments, deliberate intimidation, stalking, following, harassing + photography or recording, sustained disruption of talks or other + events, inappropriate physical contact, and unwelcome sexual + attention. If you are asked to stop any harassing behaviour, you are + expected to comply immediately. +

-

- Safe Space Hack South West is intended to be a safe space for all participants. If you - feel unsafe or threatened, or if you witness any behaviour that violates this code of conduct, - please report it to an Organiser or Guru immediately. All reports will be taken seriously and - addressed promptly and confidentially. -

+

+ + Safe Space + {" "} + Hack South West is intended to be a safe space for all participants. + If you feel unsafe or threatened, or if you witness any behaviour + that violates this code of conduct, please report it to an Organiser + or Guru immediately. All reports will be taken seriously and + addressed promptly and confidentially. +

-

- Professionalism Maintain a high standard of professionalism throughout the event. This - includes respecting deadlines, collaborating effectively with teammates, communicating - respectfully with mentors and judges, and conducting yourself in a manner that reflects - positively on yourself and the hackathon community. -

+

+ + Professionalism + {" "} + Maintain a high standard of professionalism throughout the event. + This includes respecting deadlines, collaborating effectively with + teammates, communicating respectfully with mentors and judges, and + conducting yourself in a manner that reflects positively on yourself + and the hackathon community. +

-

- Compliance with Laws and Policies Comply with all applicable laws, regulations, and - policies, including those related to intellectual property, data privacy, and online conduct. Do - not engage in any activities that may violate the rights of others or compromise the integrity - of the hackathon. -

+

+ + Compliance with Laws and Policies + {" "} + Comply with all applicable laws, regulations, and policies, + including those related to intellectual property, data privacy, and + online conduct. Do not engage in any activities that may violate the + rights of others or compromise the integrity of the hackathon. +

-

- Consequences of Violations Violations of this code of conduct may result in removal - from the hackathon premises, disqualification from the event, and/or other appropriate - consequences determined by the organisers. Serious or repeated violations may also result - in restrictions on participation in future hackathons. -

+

+ + Consequences of Violations + {" "} + Violations of this code of conduct may result in removal from the + hackathon premises, disqualification from the event, and/or other + appropriate consequences determined by the organisers. Serious or + repeated violations may also result in restrictions on participation + in future hackathons. +

-

- Reporting Procedures If you experience or witness any behaviour that violates this - code of conduct, or if you have any concerns or questions, please report it to an Organiser - or Guru immediately. Reports can be made in person or via email: - excs@groups.exeterguild.com. -

+

+ + Reporting Procedures + {" "} + If you experience or witness any behaviour that violates this code + of conduct, or if you have any concerns or questions, please report + it to an Organiser or Guru immediately. Reports can be made in + person or via email: excs@groups.exeterguild.com. +

-

- By participating in Hack South West, you acknowledge that you have read, understood, and - agree to abide by this code of conduct. We thank you for helping us create a positive and - inclusive experience for all participant -

-
- -
-
- ) -} \ No newline at end of file +

+ By participating in Hack South West, you acknowledge that you have + read, understood, and agree to abide by this code of conduct. We + thank you for helping us create a positive and inclusive experience + for all participant +

+
+
+
+ ); +} diff --git a/app/feedback/page.jsx b/app/feedback/page.jsx index 1fc2ab6..09cd317 100644 --- a/app/feedback/page.jsx +++ b/app/feedback/page.jsx @@ -1,7 +1,21 @@ export default function FeedbackPage() { - return ( -
- -
- ) -} \ No newline at end of file + return ( +
+ +
+ ); +} diff --git a/app/globals.css b/app/globals.css index 2da7c81..079b444 100644 --- a/app/globals.css +++ b/app/globals.css @@ -3,5 +3,5 @@ @tailwind utilities; :root { - @apply text-HSWtext -} \ No newline at end of file + @apply text-HSWtext; +} diff --git a/app/layout.js b/app/layout.js index cc34d89..1d64e12 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,24 +1,25 @@ -import { REM } from "next/font/google" -import "./globals.css" -import { TopBar } from "./components/TopBar" -import { Footer } from "./components/Footer" -import Head from 'next/head'; +import { REM } from "next/font/google"; +import "./globals.css"; +import { TopBar } from "./components/TopBar"; +import { Footer } from "./components/Footer"; +import Head from "next/head"; -const inter = REM({ weights: [400, 500, 600], subsets: ["latin"] }) +const inter = REM({ weights: [400, 500, 600], subsets: ["latin"] }); export const metadata = { - title: "Hack South West", - description: "Website for the annual hack south west (HSW) ocurring typically in early february", -} + title: "Hack South West", + description: + "Website for the annual hack south west (HSW) ocurring typically in early february", +}; export default function RootLayout({ children }) { - return ( - - - - {children} -