diff --git a/public/images/EXPO/baar.jpg b/public/images/EXPO/baar.jpg index c38511b..95dc901 100644 Binary files a/public/images/EXPO/baar.jpg and b/public/images/EXPO/baar.jpg differ diff --git a/public/images/EXPO/chill_ala.jpg b/public/images/EXPO/chill_ala.jpg index 7352d14..0b0c385 100644 Binary files a/public/images/EXPO/chill_ala.jpg and b/public/images/EXPO/chill_ala.jpg differ diff --git a/public/images/EXPO/console.jpg b/public/images/EXPO/console.jpg new file mode 100644 index 0000000..de20a86 Binary files /dev/null and b/public/images/EXPO/console.jpg differ diff --git a/src/app/[locale]/messiala/page.tsx b/src/app/[locale]/messiala/page.tsx index 5721527..56e6641 100644 --- a/src/app/[locale]/messiala/page.tsx +++ b/src/app/[locale]/messiala/page.tsx @@ -1,5 +1,125 @@ import { vipnagorgialla } from "@/components/Vipnagorgialla"; +import Image from "next/image"; +import Link from "next/link"; import { getTranslations, setRequestLocale } from "next-intl/server"; +import { developers, universities } from "@/data/expo"; + +/** Thick semi-transparent cyan rule that separates the full-bleed sections. */ +const DIVIDER = "border-t-4 border-[rgba(0,163,224,0.5)]"; +/** Horizontal padding used by the padded sections (64px at the design width). */ +const GUTTER = "px-4 sm:px-8 lg:px-16"; + +/** Blue gradient placeholder standing in for a venue map (real images TBD). */ +function MapCard({ label }: { label: string }) { + return ( +
+

+ {label} +

+
+ ); +} + +/** + * Photo tile in the gallery band: the image is faded over the dark background + * (as in the design) with a large caption. Caption alignment is configurable so + * the middle tile can sit bottom-right like the mockup. + */ +function FadedPhoto({ + image, + caption, + align = "left", + valign = "center", +}: { + image: string; + caption: string; + align?: "left" | "right"; + valign?: "center" | "bottom"; +}) { + return ( +
+ +
+

+ {caption} +

+
+
+ ); +} + +/** Skewed section heading (no rule underneath — sections are split by DIVIDER). */ +function SectionHeading({ children }: { children: React.ReactNode }) { + return ( +
+

+ {children} +

+
+ ); +} + +/** One game card: bordered thumbnail, a linked title, and a subtitle line. */ +function GameCard({ + image, + title, + subtitle, + url, + cover, +}: { + image: string; + title: string; + subtitle: string; + url: string; + cover: boolean; +}) { + return ( +
+
+ {title} +
+ + {title} + +

+ {subtitle} +

+
+ ); +} export default async function Expo({ params, @@ -11,17 +131,115 @@ export default async function Expo({ const t = await getTranslations({ locale }); return ( -
-

- {t("expo.title")} -

-

- {t("expo.comingSoon")} -

+
+
+ {/* Page title */} +
+

+ {t("expo.title")} +

+
+ + {/* Venue maps */} +
+
+ + +
+
+ + {/* Mini-tournaments feature (full-bleed) */} +
+ +
+
+

+ {t("expo.miniTournaments.title")} +

+

+ {t("expo.miniTournaments.description")} +

+ + + +
+
+ + {/* Photo gallery: two faded tiles left, one tall faded tile right, + separated by thin cyan gaps (the band background shows through). */} +
+
+
+ + +
+ +
+
+ + {/* Estonian game developers */} +
+ {t("expo.developers")} +
+ {developers.map((dev) => ( + + ))} +
+
+ + {/* Universities */} +
+ {t("expo.universities")} +
+ {universities.map((uni) => ( + + ))} +
+
+
); } diff --git a/src/data/expo.ts b/src/data/expo.ts new file mode 100644 index 0000000..155c8d6 --- /dev/null +++ b/src/data/expo.ts @@ -0,0 +1,86 @@ +// Content for the Messiala (expo) page. +// +// Titles, studio and team names are proper nouns, so they live here as plain +// strings rather than in the translation files. Section headings and captions +// are translated (see the `expo` block in translations/et.json + en.json). +// +// NOTE: only the four cards shown in the design mockup are listed here. More +// logos are available under public/images/EXPO/GameDev logos and +// public/images/EXPO/ylikoolid if this list should grow later. +// Paths use %20 for the space in the "GameDev logos" folder name. + +export interface DeveloperCard { + /** Game / product name (proper noun, shown as-is). */ + title: string; + /** Studio behind it. TODO: confirm the two "Placeholder Gameworks" entries. */ + studio: string; + /** Logo image under /public. Rendered object-contain in a bordered box. */ + logo: string; + /** External link for the game title (opens in a new tab). */ + url: string; +} + +export interface UniversityCard { + /** Game name (proper noun, shown as-is). */ + title: string; + /** Team / course that made it. */ + team: string; + /** Landscape thumbnail under /public. Rendered object-cover. */ + image: string; + /** External link for the game title (opens in a new tab). */ + url: string; +} + +export const developers: DeveloperCard[] = [ + { + title: "Broken Alliance", + studio: "Placeholder Gameworks", + logo: "/images/EXPO/GameDev%20logos/broken_alliance.png", + url: "https://placeholder.games/", + }, + { + title: "Buckshot Roulette", + studio: "Mike Klubnika", + logo: "/images/EXPO/mklubi.jpg", + url: "https://store.steampowered.com/app/2835570/Buckshot_Roulette/", + }, + { + title: "CraftCraft Simulator", + studio: "Placeholder Gameworks", + logo: "/images/EXPO/GameDev%20logos/craftcat_sim.png", + url: "https://placeholder.games/", + }, + { + title: "CYBER DOC ROGUE", + studio: "HRA Interactive", + logo: "/images/EXPO/GameDev%20logos/Cyber_Doc_Rogue.png", + url: "https://drive.google.com/drive/folders/1R6_3s92byAeHlKMeBP8f5ZnclUl5Wpj5?usp=sharing", + }, +]; + +export const universities: UniversityCard[] = [ + { + title: "Dwarf Escape", + team: 'TalTech GameCamp ("Mõmmid")', + image: "/images/EXPO/ylikoolid/dwarf_escape.png", + url: "https://ihorsylin.itch.io/dwarf-escape", + }, + { + title: "Packet Tracers", + team: "TalTech IT-teaduskond", + image: "/images/EXPO/ylikoolid/packet_tracers.png", + url: "https://alacrisdevs.itch.io/packet-tracers", + }, + { + title: "OH CRAP!", + team: 'TalTech GameCamp ("Skill Issue")', + image: "/images/EXPO/ylikoolid/oh_crap.png", + url: "https://heavybro.itch.io/oh-crap", + }, + { + title: "Void of Hermes", + team: 'TalTech GameCamp ("OnlyFun")', + image: "/images/EXPO/ylikoolid/void_of_hermes.png", + url: "https://ron88.itch.io/voidofhermes", + }, +]; diff --git a/translations/en.json b/translations/en.json index 6f5be1a..4d8f368 100644 --- a/translations/en.json +++ b/translations/en.json @@ -861,6 +861,20 @@ "title": "Expo Area", "comingSoon": "Coming soon", "description": "The TipiLAN expo area hosts companies, additional activities and lectures.", + "mapFoyer": "Foyer map", + "mapStudentHouse": "Student house map", + "miniTournaments": { + "title": "Mini-tournaments", + "description": "TipiLAN hosts a variety of fun and competitive mini-tournaments. Regular visitors can take part too! The total prize pool across all tournaments is 1250€.", + "cta": "More about mini-tournaments" + }, + "photos": { + "chill": "Chill area with live tournament broadcasts", + "console": "Lots of different video games and consoles", + "bar": "Bar area with drinks and snacks" + }, + "developers": "Estonian game developers", + "universities": "Universities", "areas": { "bar": "Bar", "boardGames": "Board Games Area", diff --git a/translations/et.json b/translations/et.json index 416640b..02c9184 100644 --- a/translations/et.json +++ b/translations/et.json @@ -862,6 +862,20 @@ "title": "Messiala", "comingSoon": "Tuleb hiljem", "description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud.", + "mapFoyer": "Fuajee kaart", + "mapStudentHouse": "Tudengimaja kaart", + "miniTournaments": { + "title": "Miniturniirid", + "description": "TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu tekitavaid miniturniire. Osaleda saavad ka niisama külastajad! Auhinnafond on kõigi turniiride peale 1250€.", + "cta": "Miniturniiridest lähemalt" + }, + "photos": { + "chill": "Chill-ala koos turniiride otseülekandega", + "console": "Palju erinevaid videomänge ja konsoole", + "bar": "Baariala jookide ja snäkkidega" + }, + "developers": "Eesti mänguarendajad", + "universities": "Ülikoolid", "areas": { "bar": "Baar", "boardGames": "Lauamängude ala",