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/public/images/EXPO/gamedev/bullosseum.png b/public/images/EXPO/gamedev/bullosseum.png
new file mode 100644
index 0000000..9c43327
Binary files /dev/null and b/public/images/EXPO/gamedev/bullosseum.png differ
diff --git a/public/images/EXPO/gamedev/eelloon.png b/public/images/EXPO/gamedev/eelloon.png
new file mode 100644
index 0000000..e51d5bb
Binary files /dev/null and b/public/images/EXPO/gamedev/eelloon.png differ
diff --git a/public/images/EXPO/gamedev/estonian_language.png b/public/images/EXPO/gamedev/estonian_language.png
new file mode 100644
index 0000000..89deca5
Binary files /dev/null and b/public/images/EXPO/gamedev/estonian_language.png differ
diff --git a/public/images/EXPO/gamedev/grandpas_bee_haven.png b/public/images/EXPO/gamedev/grandpas_bee_haven.png
new file mode 100644
index 0000000..faec50b
Binary files /dev/null and b/public/images/EXPO/gamedev/grandpas_bee_haven.png differ
diff --git a/public/images/EXPO/gamedev/hardwired.png b/public/images/EXPO/gamedev/hardwired.png
new file mode 100644
index 0000000..94c7444
Binary files /dev/null and b/public/images/EXPO/gamedev/hardwired.png differ
diff --git a/public/images/EXPO/gamedev/hearthland.png b/public/images/EXPO/gamedev/hearthland.png
new file mode 100644
index 0000000..1b80d28
Binary files /dev/null and b/public/images/EXPO/gamedev/hearthland.png differ
diff --git a/public/images/EXPO/gamedev/jazzwitch.png b/public/images/EXPO/gamedev/jazzwitch.png
new file mode 100644
index 0000000..3031254
Binary files /dev/null and b/public/images/EXPO/gamedev/jazzwitch.png differ
diff --git a/public/images/EXPO/gamedev/machine_party.png b/public/images/EXPO/gamedev/machine_party.png
new file mode 100644
index 0000000..19a03b4
Binary files /dev/null and b/public/images/EXPO/gamedev/machine_party.png differ
diff --git a/public/images/EXPO/gamedev/manala.png b/public/images/EXPO/gamedev/manala.png
new file mode 100644
index 0000000..aab9cd1
Binary files /dev/null and b/public/images/EXPO/gamedev/manala.png differ
diff --git a/public/images/EXPO/gamedev/midnight_clinic.png b/public/images/EXPO/gamedev/midnight_clinic.png
new file mode 100644
index 0000000..d383fbc
Binary files /dev/null and b/public/images/EXPO/gamedev/midnight_clinic.png differ
diff --git a/public/images/EXPO/gamedev/midnight_souvenirs.png b/public/images/EXPO/gamedev/midnight_souvenirs.png
new file mode 100644
index 0000000..633df63
Binary files /dev/null and b/public/images/EXPO/gamedev/midnight_souvenirs.png differ
diff --git a/public/images/EXPO/gamedev/multimatum.png b/public/images/EXPO/gamedev/multimatum.png
new file mode 100644
index 0000000..3f0fc1a
Binary files /dev/null and b/public/images/EXPO/gamedev/multimatum.png differ
diff --git a/public/images/EXPO/gamedev/orms.png b/public/images/EXPO/gamedev/orms.png
new file mode 100644
index 0000000..7fc2d5f
Binary files /dev/null and b/public/images/EXPO/gamedev/orms.png differ
diff --git a/public/images/EXPO/gamedev/osta.png b/public/images/EXPO/gamedev/osta.png
new file mode 100644
index 0000000..c37681a
Binary files /dev/null and b/public/images/EXPO/gamedev/osta.png differ
diff --git a/public/images/EXPO/gamedev/self_storm.svg b/public/images/EXPO/gamedev/self_storm.svg
new file mode 100644
index 0000000..71c5b7d
--- /dev/null
+++ b/public/images/EXPO/gamedev/self_storm.svg
@@ -0,0 +1,14 @@
+
diff --git a/public/images/EXPO/gamedev/toimkonna_simulator.png b/public/images/EXPO/gamedev/toimkonna_simulator.png
new file mode 100644
index 0000000..eff88ec
Binary files /dev/null and b/public/images/EXPO/gamedev/toimkonna_simulator.png differ
diff --git a/public/images/EXPO/gamedev/walk.png b/public/images/EXPO/gamedev/walk.png
new file mode 100644
index 0000000..d260680
Binary files /dev/null and b/public/images/EXPO/gamedev/walk.png differ
diff --git a/public/images/EXPO/gamedev/war_torn.png b/public/images/EXPO/gamedev/war_torn.png
new file mode 100644
index 0000000..094c776
Binary files /dev/null and b/public/images/EXPO/gamedev/war_torn.png differ
diff --git a/public/images/messiala/fuajee-kaart.svg b/public/images/messiala/fuajee-kaart.svg
new file mode 100644
index 0000000..9763d7a
--- /dev/null
+++ b/public/images/messiala/fuajee-kaart.svg
@@ -0,0 +1,44 @@
+
diff --git a/public/images/messiala/tudengimaja-kaart.svg b/public/images/messiala/tudengimaja-kaart.svg
new file mode 100644
index 0000000..1cb13e8
--- /dev/null
+++ b/public/images/messiala/tudengimaja-kaart.svg
@@ -0,0 +1,40 @@
+
diff --git a/src/app/[locale]/messiala/page.tsx b/src/app/[locale]/messiala/page.tsx
index 5721527..93de3ba 100644
--- a/src/app/[locale]/messiala/page.tsx
+++ b/src/app/[locale]/messiala/page.tsx
@@ -1,5 +1,153 @@
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";
+
+/** Venue map card: the map SVG rendered transparent over the page background. */
+function MapCard({ image, label }: { image: string; label: string }) {
+ return (
+
+
+
+ );
+}
+
+/**
+ * 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 showcase card: a cyan-bordered logo box above a linked title and a
+ * studio/team line. Logos render object-contain; screenshots (`cover`) fill the
+ * box. Teams without a logo yet fall back to their name set inside the box.
+ */
+function GameCard({
+ image,
+ title,
+ subtitle,
+ url,
+ cover = false,
+}: {
+ image?: string;
+ title: string;
+ subtitle: string;
+ url?: string;
+ cover?: boolean;
+}) {
+ const titleEl = url ? (
+
+ {title}
+
+ ) : (
+
+ {title}
+
+ );
+
+ return (
+
+
+ {image ? (
+
+ ) : (
+
+ {title}
+
+ )}
+
+ {titleEl}
+
+ {subtitle}
+
+
+ );
+}
export default async function Expo({
params,
@@ -11,17 +159,120 @@ export default async function Expo({
const t = await getTranslations({ locale });
return (
-