Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4615f70
added sparkles to corner
phillipnguyenn Feb 7, 2026
91a3fb0
added second sparkle to second section of index
phillipnguyenn Feb 7, 2026
418667e
reduced the size of two sparkles
phillipnguyenn Feb 7, 2026
c52ed9d
moved double sparkles from index to event highlight card
phillipnguyenn Feb 10, 2026
9ef4639
added 3 randomised images which loads new combination for sparkles
phillipnguyenn Feb 18, 2026
a211ff9
changed logic of random sparkles to just choose random number instead…
phillipnguyenn Feb 18, 2026
12dc4cc
fixed up to be cleaner logic for random sparkle
phillipnguyenn Feb 18, 2026
af5dadb
changed opacity of sparkles to be full
phillipnguyenn Feb 18, 2026
d2ed15b
changed order of sparkle overlay to account for images, sparkle shoul…
phillipnguyenn Feb 18, 2026
a4a7556
corrected placement of sparkle again..
phillipnguyenn Feb 18, 2026
0c1574d
added explosion component with framer motion, bomb can be clicked
phillipnguyenn Feb 21, 2026
fe204e8
added random offset for game effect
phillipnguyenn Feb 21, 2026
a403047
modified handling of explosion to ensure that animation fully plays b…
phillipnguyenn Feb 21, 2026
ca72580
added ability to pass x & y offsets to adjust exact positioning of ex…
phillipnguyenn Feb 21, 2026
bcf315c
added offset to better center explosion for bomb
phillipnguyenn Feb 21, 2026
43750c1
changed look of explosion to be more pixelated
phillipnguyenn Feb 21, 2026
cd1debb
added better randomness for the each individual particle
phillipnguyenn Feb 21, 2026
bf62e22
changed number of particles (odd numbers work better)
phillipnguyenn Feb 21, 2026
198e3d8
added better comments for sparkle selection logic
phillipnguyenn Feb 21, 2026
e2ab4a1
removed magic numbers for sparkle overlay
phillipnguyenn Feb 21, 2026
adbedec
merge main into issue-69 to prepare for sparkle PR
phillipnguyenn Feb 21, 2026
41b38a7
refactor: enhance sparkle overlay logic with unique index handling, i…
phillipnguyenn Feb 21, 2026
22698c9
refactor: change Explosion component to export function syntax
phillipnguyenn Feb 21, 2026
582f32e
explosions now work without re-rendering sparkles
phillipnguyenn Feb 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions client/documentation/admin-dashboard/members.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Member Profiles

Profiles of club members can be added and edited at the row 'Member' of the GAME_DEV section on the main admin page.

### Fields

**Name:** Required field for the member's name. A character field (includes letters, numbers and symbols) of maximum length 200 characters.

**Active:** Checkbox to represent whether a member is an active participant in the club. If the checkbox is not ticked then the member's profile will not be displayed on the website.

**Profile Picture:** Optional field to upload a profile picture. Must be an image file, and will display best if the image is at least 128 by 128 px in size. If no profile picture is provided then the member's initials will be displayed instead.

**About:** Optional field for a bio. A character field of maximum length 256 characters.

**Pronouns:** Optional field for the member's pronouns. A character field of maximum length 20 characters.

**Social media links:** Optional section to display links to the member's social media profiles. Requires a link to the profile (character field of maximum length 2083) and, optionally, the profile username (character field of maximum length 200). If a username is not supplied then only a social media icon will be displayed with the link attached, otherwise the username will be placed next to the relevant icon. The type of icon to be displayed (e.g. instagram, linkedin, generic link) is inferred from the social media link provided.
104 changes: 52 additions & 52 deletions client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
"@tanstack/react-query": "^5.80.7",
"@tanstack/react-query-devtools": "^5.80.7",
"autoprefixer": "^10.4.21",
"axios": "^1.12.0",
"axios": "^1.13.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"framer-motion": "^12.23.24",
"is-inside-container": "^1.0.0",
"lucide-react": "^0.516.0",
"next": "15.4.11",
"next": "15.5.10",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-social-icons": "^6.25.0",
Expand Down
9 changes: 0 additions & 9 deletions client/public/frame.svg

This file was deleted.

9 changes: 9 additions & 0 deletions client/public/pixel-art-frame.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added client/public/sparkle_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added client/public/sparkle_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added client/public/sparkle_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
46 changes: 41 additions & 5 deletions client/src/components/main/MemberProfile.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import Image from "next/image";
import { SocialIcon } from "react-social-icons";

// unused atm, as the member isnt linked a project on the backend
/* export type MemberProfileProject = {
Expand All @@ -15,6 +16,11 @@ export type MemberProfileData = {
about: string;
pronouns?: string;
profile_picture?: string;
social_media?: {
link: string;
socialMediaUserName: string;
}[];
pk: number;
};

type MemberProfileProps = {
Expand Down Expand Up @@ -54,19 +60,49 @@ export function MemberProfile({ member }: MemberProfileProps) {
)}
</div>
<Image
src="/frame.svg"
src="/pixel-art-frame.svg"
alt="golden pixel art frame around profile picture"
width={176}
height={192}
className="z-0 h-48 w-44"
width={200}
height={200}
className="z-10"
/>
</div>
<div className="flex w-4/5 flex-col gap-2 rounded-md p-2.5 font-firaCode">
<div className="flex">
<p className="min-w-fit font-jersey10 text-4xl">{member.name}</p>
<hr className="ml-5 hidden w-full self-center border-light_2 lg:flex" />
</div>
<p className="text-lg">{member.pronouns}</p>
<div className="flex items-center gap-2">
{member.social_media && member.social_media.length > 0 && (
<div className="w-full">
<div className="mt-2 flex flex-wrap items-center gap-2">
{member.social_media.map((sm) => (
<span
key={sm.link}
className="ml-2 flex items-center gap-1"
>
<SocialIcon
url={sm.link}
style={{ height: 24, width: 24 }}
/>
<a
href={sm.link}
target="_blank"
rel="noopener noreferrer"
className="font-firaCode text-base underline hover:text-primary"
>
{sm.socialMediaUserName}
</a>
</span>
))}
</div>
</div>
)}
</div>
<div className="flex items-center gap-2">
<p className="text-lg">{member.pronouns}</p>
</div>

<p>{member.about}</p>
</div>
</div>
Expand Down
57 changes: 57 additions & 0 deletions client/src/components/ui/Explosion.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { motion } from "framer-motion";

type ExplosionProps = {
colour1: string;
colour2: string;
// looks better with odd numbers
count: number;
// can optionally take offsets to adjust exact position
yOffset?: number;
xOffset?: number;
};

export function Explosion({
colour1,
colour2,
count,
yOffset = 0,
xOffset = 0,
}: ExplosionProps) {
const particles = Array.from({ length: count });

return (
<div className="pointer-events-none absolute inset-0 z-0 flex items-center justify-center">
{particles.map((_, i) => {
const individualSize = Math.random() * 0.1 + 4;
const randomDisplacement = Math.random() * 10;

// for every particle return a particle with a different size
return (
<motion.div
key={i}
initial={{
x: xOffset,
y: yOffset,
opacity: 1,
scale: individualSize,
}}
animate={{
x: Math.cos(i + randomDisplacement) * 150 + xOffset,
y: Math.sin(i + randomDisplacement) * 150 + yOffset,
opacity: 0,
scale: 0,
}}
transition={{ duration: 0.6, ease: "easeOut" }}
className="absolute h-4 w-4 rounded-none"
style={{
backgroundColor: i % 2 === 0 ? colour1 : colour2,
boxShadow: `0 0 10px ${colour1}`,
}}
/>
);
})}
</div>
);
}

export default Explosion;
Loading