Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
b24ca73
Created ItchEmbed component for widget
nicostellar Nov 29, 2025
d5c2e34
Added page structure for game pages
nicostellar Nov 29, 2025
93b80d3
Fix file structure in-line with desired URLs
nicostellar Nov 29, 2025
9e3c0a3
Enhance GameLandingPage with detailed game information and art gallery
bilibilistack Nov 29, 2025
ebccffd
rename from header to section for first image
bilibilistack Nov 29, 2025
286b245
rename function to IndividualGamePage to better reflect purpose
nicostellar Nov 29, 2025
ba6ef8d
add itch.io embed with ItchEmbed component
nicostellar Nov 29, 2025
51ecf1e
Created Games model with fields and sample Event fields for foreignkey
RadinMan Nov 29, 2025
bd8811b
Merge branch 'issue-7-Individual_game_pages' of https://github.com/co…
RadinMan Nov 29, 2025
6f225ea
Add Game Cover Image and Style Enhancements to Individual Game Page
bilibilistack Nov 29, 2025
101cb75
Refactor Individual Game Page layout and remove unused CSS styles
bilibilistack Nov 29, 2025
e5c4d1b
Fix issue of ItchEmbed inconsistent between server response and clien…
bilibilistack Nov 29, 2025
437d605
Fixed: Games class completion field to use models.IntegerChoices
RadinMan Nov 29, 2025
c400dc4
Created new migration for the new models in models.py
RadinMan Nov 29, 2025
8e7f777
Merge branch 'issue-7-Individual_game_pages' of https://github.com/co…
RadinMan Nov 29, 2025
af3483b
Added: itchEmbeddedID field to the Game Class for itch.io widget embe…
RadinMan Nov 29, 2025
35c68b4
Merge branch 'main' into issue-7-Individual_game_pages
bilibilistack Dec 3, 2025
4e034e4
Enhance Individual Game Page: Update game cover image, and include ex…
bilibilistack Dec 3, 2025
7f04583
Improved file readability
RadinMan Dec 3, 2025
efba98f
Issue Fixed: itchEmbeddedID gets default to None, for games with itch…
RadinMan Dec 3, 2025
2956ed9
Fix layout of ItchEmbed section on Individual Game Page for better al…
bilibilistack Dec 4, 2025
32a089a
Merge branch 'issue-7-Individual_game_pages' of https://github.com/co…
RadinMan Dec 6, 2025
360990a
Merge pull request #26 from codersforcauses/issue-7-Individual_game_p…
bilibilistack Dec 6, 2025
0dee0b2
Remove unnecessary link from ItchEmbed component for cleaner renderin…
bilibilistack Dec 6, 2025
91de20c
Fixed: pathToThumbnail renamed from pathhToMedia and fixed the models…
RadinMan Dec 6, 2025
aa8791c
Enhance Individual Game Page layout and content; add game description…
bilibilistack Dec 6, 2025
6d60160
Update Individual Game Page layout; enhance game description and adju…
bilibilistack Dec 10, 2025
d542650
Refactor Individual Game Page layout; streamline game description ren…
bilibilistack Dec 10, 2025
acd3dbf
Merge branch 'main' into issue-7-Individual_game_pages
bilibilistack Dec 10, 2025
3a30cff
Remove wiki picture configuration
bilibilistack Dec 15, 2025
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
3 changes: 3 additions & 0 deletions client/next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ const config = {
root: import.meta.dirname,
},
outputFileTracingRoot: import.meta.dirname,
images: {
domains: ["localhost"],
},
// Turns on file change polling for the Windows Dev Container
// Doesn't work currently for turbopack, so file changes will not automatically update the client.
// watchOptions: isWindowsDevContainer()
Expand Down
26 changes: 26 additions & 0 deletions client/src/components/ui/ItchEmbed.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
relevant game model values:
name
hostURL
itchEmbedID
*/

type ItchEmbedProps = {
embedID: string;
// hostURL: string;
name: string;
};

export function ItchEmbed({ embedID, name }: ItchEmbedProps) {
return (
<div className="aspect-[7/2] w-full" style={{ maxHeight: 167 }}>
<iframe
className="h-full w-full border-0"
src={`https://itch.io/embed/${embedID}`}
title={name}
allowFullScreen
style={{ maxHeight: 167 }}
/>
</div>
);
}
118 changes: 118 additions & 0 deletions client/src/pages/games/[id].tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import Image from "next/image";
import React from "react";

import { ItchEmbed } from "@/components/ui/ItchEmbed";

export default function IndividualGamePage() {
// Example data variables (replace with backend data in the future)
const gameTitle = "Minecraft";
const gameCover =
"https://upload.wikimedia.org/wikipedia/en/b/b6/Minecraft_2024_cover_art.png";
const gameDescription = [
"Minecraft is a sandbox game developed and published by Mojang Studios. Formally released on 18 November 2011 for personal computers following its initial public alpha release on 17 May 2009, it has been ported to numerous platforms, including mobile devices and various video game consoles....",
"In Minecraft, players explore a procedurally generated, three-dimensional world with virtually infinite terrain made up of voxels (cubes). Players can discover and extract raw materials, craft tools and items, and build structures, earthworks, and machines. Depending on the game mode, players can fight hostile mobs, as well as cooperate with or compete against other players in multiplayer. The game's large community offers a wide variety of user-generated content, such as modifications, servers, player skins, texture packs, and custom maps, which add new game mechanics and possibilities.",
"The game has several modes, including Survival mode, where players must acquire resources to build the world and maintain health; Creative mode, where players have unlimited resources to build with and the ability to fly; Adventure mode, where players can play custom maps created by other players with certain restrictions; and Spectator mode, where players can freely move throughout a world without being affected by gravity or world interactions.",
"Minecraft has been praised for its creativity and freedom, allowing players to build complex structures and mechanisms using redstone circuits. It has also been used in educational settings to teach subjects such as mathematics, history, and computer programming.",
"The game has received numerous updates since its release, adding new features, blocks, mobs, and gameplay mechanics. Notable updates include the 'Nether Update,' which revamped the Nether dimension; the 'Caves & Cliffs Update,' which introduced new cave generation and mountain biomes; and the 'Wild Update,' which added new mobs like the Warden and new biomes such as the Deep Dark.",
"Minecraft has become one of the best-selling video games of all time, with over 200 million copies sold across all platforms by 2021. It has a large and active player base, with millions of players logging in daily to explore, build, and create in its expansive worlds.",
"The game's success has led to various spin-offs and merchandise, including books, toys, and an upcoming feature film. Minecraft's impact on gaming culture is significant, influencing many other games and inspiring a generation of gamers and developers.",
"Overall, Minecraft's combination of creativity, exploration, and community-driven content has solidified its place as a beloved and enduring title in the gaming industry.",
];
const contributors = ["Developer 1", "Developer 2", "Artist 1"];
const devStage = "Beta";
const hostSite = "itch.io/xxx";
const event = "Game Jam November 2025";
const artImages = [
{
src: "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Minecraft_Zombie.png/120px-Minecraft_Zombie.png",
alt: "Minecraft Zombie",
},
{
src: "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Minecraft_Enderman.png/120px-Minecraft_Enderman.png",
alt: "Minecraft Enderman",
},
{
src: "https://upload.wikimedia.org/wikipedia/en/thumb/1/17/Minecraft_explore_landscape.png/375px-Minecraft_explore_landscape.png",
alt: "Minecraft Landscape",
},
];
return (
<div className="min-h-screen bg-[#181a25] font-sans text-[#e3e6f3]">
<main className="mx-auto max-w-7xl p-8">
<section className="mb-8 flex flex-col items-center justify-center gap-8 rounded-xl bg-[#232345] p-6 shadow-lg">
<div className="flex w-full flex-wrap items-start justify-center gap-8">
<div className="flex w-full justify-center md:flex-1">
<Image
src={gameCover}
alt="Game Cover"
width={800}
height={800}
className="h-auto max-h-[60vh] w-full max-w-full rounded-2xl bg-[#232345] object-contain shadow-lg md:max-w-[60vw]"
priority
/>
</div>
<div className="w-full md:w-auto">
<table className="mt-4 w-full min-w-[220px] border-collapse border-spacing-0">
<tbody>
<tr className="border-b-2 border-gray-300">
<td className="py-2 pr-2">Contributors</td>
<td className="py-2">
{contributors.map((c, i) => (
<span key={c}>
{c}
{i < contributors.length - 1 && <br />}
</span>
))}
</td>
</tr>
<tr className="border-b-2 border-gray-300">
<td className="py-2 pr-2">Development Stage</td>
<td className="py-2">{devStage}</td>
</tr>
<tr className="border-b-2 border-gray-300">
<td className="py-2 pr-2">Host Site</td>
<td className="py-2">{hostSite}</td>
</tr>
<tr>
<td className="py-2 pr-2">Event</td>
<td className="py-2">{event}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div className="mt-8 flex w-full min-w-[260px] flex-col gap-4">
<h1 className="mb-2 text-center font-jersey10 text-4xl font-bold tracking-wide text-[#7ecfff] drop-shadow-lg">
{gameTitle}
</h1>
<ul>
{gameDescription.map((desc, i) => (
<li key={i}>{desc}</li>
))}
</ul>
</div>
</section>
<section className="mt-8 flex flex-col items-center">
<ItchEmbed embedID="3" name="X-Moon by leafy" />
<h2 className="mb-4 font-jersey10 text-3xl tracking-wide text-[#7ecfff]">
ARTWORK
</h2>

<div className="mx-auto mb-6 flex h-[240px] w-full max-w-4xl justify-center gap-6 overflow-hidden">
{artImages.map((img) => (
<Image
key={img.alt}
src={img.src}
alt={img.alt}
width={240}
height={240}
className="rounded-lg bg-[#232345] object-contain shadow-md"
/>
))}
</div>
</section>
</main>
{/* <Footer /> */}
</div>
);
}
Empty file.
69 changes: 69 additions & 0 deletions server/game_dev/migrations/0002_events_games.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Generated by Django 5.1.14 on 2025-11-29 07:26

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("game_dev", "0001_initial"),
]

operations = [
migrations.CreateModel(
name="Events",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=200)),
("description", models.CharField(max_length=4500)),
],
),
migrations.CreateModel(
name="Games",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=200)),
("description", models.CharField(max_length=4500)),
(
"completion",
models.IntegerField(
choices=[
(1, "Work in Progress (Unplayable)"),
(2, "Playable - In Development"),
(3, "Beta - Stable but not Final"),
(4, "Completed"),
],
default=1,
),
),
("active", models.BooleanField(default=True)),
("hostURL", models.CharField(max_length=2083)),
("isItch", models.BooleanField(default=True)),
("pathToMedia", models.CharField(max_length=2083)),
(
"event",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="game_dev.events",
),
),
],
),
]
18 changes: 18 additions & 0 deletions server/game_dev/migrations/0003_games_itchembeddedid.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.1.14 on 2025-12-03 10:54

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("game_dev", "0002_events_games"),
]

operations = [
migrations.AddField(
model_name="games",
name="itchEmbeddedID",
field=models.PositiveIntegerField(default=None),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 5.1.14 on 2025-12-06 07:33

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("game_dev", "0003_games_itchembeddedid"),
]

operations = [
migrations.RemoveField(
model_name="games",
name="itchEmbeddedID",
),
migrations.AlterField(
model_name="games",
name="event",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="game_dev.events",
),
),
migrations.AlterField(
model_name="games",
name="hostURL",
field=models.CharField(
help_text="If game is stored on itch.io, please enter the 7 digit long game id as its hostURL, i.e., 1000200",
max_length=2083,
),
),
migrations.AlterField(
model_name="games",
name="pathToMedia",
field=models.ImageField(null=True, upload_to="games/[id]/"),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.1.14 on 2025-12-06 07:54

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("game_dev", "0004_remove_games_itchembeddedid_alter_games_event_and_more"),
]

operations = [
migrations.RemoveField(
model_name="games",
name="pathToMedia",
),
migrations.AddField(
model_name="games",
name="pathToThumbnail",
field=models.ImageField(null=True, upload_to="games/"),
),
]
38 changes: 38 additions & 0 deletions server/game_dev/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,41 @@ class Member(models.Model):

def __str__(self):
return str(self.name)


# Sample Events Class made
class Events(models.Model):
name = models.CharField(max_length=200, null=False)
description = models.CharField(max_length=4500)

def __str__(self):
return str(self.name)


class Games(models.Model):

# Enum choices
class CompletionStatus(models.IntegerChoices):
WIP = 1, "Work in Progress (Unplayable)"
PLAYABLE_DEV = 2, "Playable - In Development"
BETA = 3, "Beta - Stable but not Final"
COMPLETED = 4, "Completed"

name = models.CharField(max_length=200, null=False)
description = models.CharField(max_length=4500)
completion = models.IntegerField(
choices=CompletionStatus.choices,
default=CompletionStatus.WIP,
null=False,
)
active = models.BooleanField(default=True, null=False)
hostURL = models.CharField(
max_length=2083,
help_text="If game is stored on itch.io, please enter the 7 digit long game id as its hostURL, i.e., 1000200"
) # If isItch is true then input only the Game ID
isItch = models.BooleanField(default=True, null=False)
pathToThumbnail = models.ImageField(upload_to="games/", null=True)
event = models.ForeignKey(Events, on_delete=models.SET_NULL, null=True, blank=True)

def __str__(self):
return str(self.name)