+
- {t("navigation.schedule")}
+ {t("navigation.tickets")}
arrow_right_alt
@@ -74,20 +39,21 @@ export default async function Home({
- event_note
+ confirmation_number
{t("home.sections.schedule.description")}
+
-
+
{t("navigation.tournaments")}
@@ -95,7 +61,6 @@ export default async function Home({
arrow_right_alt
-
trophy
@@ -105,52 +70,10 @@ export default async function Home({
-
-
-
- {t("navigation.expo")}
-
-
- arrow_right_alt
-
-
-
-
- weekend
-
-
- {t("home.sections.expo.description")}
-
-
-
- {/* Section preserved for next year development */}
- {/* Date */}
- {/*
*/}
- {/*
*/}
- {/*
*/}
- {/*
*/}
- {/* {t("home.sections.reserveSpot")}*/}
- {/*
*/}
- {/* */}
- {/* arrow_right_alt*/}
- {/* */}
- {/* */}
- {/*
*/}
- {/* {t("home.sections.dateAndLocation")}*/}
- {/*
*/}
- {/* */}
- {/*
*/}
+ {/* Teaser carousel */}
+
{/* Sponsors */}
diff --git a/src/components/HeroSection.tsx b/src/components/HeroSection.tsx
new file mode 100644
index 0000000..b4aed5d
--- /dev/null
+++ b/src/components/HeroSection.tsx
@@ -0,0 +1,75 @@
+import Image from "next/image";
+import { Link } from "@/i18n/routing";
+import { vipnagorgialla } from "@/components/Vipnagorgialla";
+import { useTranslations } from "next-intl";
+
+export default function HeroSection() {
+ const t = useTranslations("home");
+
+ return (
+
+ {/* Background image */}
+
+ {/* Dark overlay */}
+
+
+ {/* Content */}
+
+ {/* Left: logo + info + CTA */}
+
+
+
+
+ {t("hero.date")}
+
+
+ {t("hero.location")}
+
+
+
+ {t("hero.buyTicket")}
+
+
+
+ {/* Right: prize pool + award */}
+
+
+
+ {t("hero.prizePool")}
+
+
+ 10 000€
+
+
+
+
+
+ {t("hero.award")}
+
+
+
+
+
+ );
+}
diff --git a/src/components/TeaserCarousel.tsx b/src/components/TeaserCarousel.tsx
new file mode 100644
index 0000000..3c1aaab
--- /dev/null
+++ b/src/components/TeaserCarousel.tsx
@@ -0,0 +1,124 @@
+"use client";
+
+import { useState, useEffect, useCallback } from "react";
+import Image from "next/image";
+import { Link } from "@/i18n/routing";
+import { vipnagorgialla } from "@/components/Vipnagorgialla";
+import { useTranslations } from "next-intl";
+
+type Slide = {
+ key: "compete" | "play" | "explore";
+ image: string;
+ imageAlt: string;
+ hero: string;
+ href: "/turniirid" | "/piletid" | "/messiala";
+ flip?: boolean;
+ fullBrightness?: boolean;
+};
+
+const slides: Slide[] = [
+ { key: "compete", image: "/images/landing/compete_teaser.jpg", imageAlt: "Võistle", hero: "/images/landing/compete_hero.png", href: "/turniirid" },
+ { key: "play", image: "/images/landing/play_teaser.png", imageAlt: "Mängi", hero: "/images/landing/play_hero.png", href: "/piletid", flip: true, fullBrightness: true },
+ { key: "explore", image: "/images/landing/explore_teaser.png", imageAlt: "Avasta", hero: "/images/landing/explore_hero.png", href: "/messiala", fullBrightness: true },
+];
+
+export default function TeaserCarousel() {
+ const t = useTranslations("home.teaser");
+ const [current, setCurrent] = useState(0);
+
+ const next = useCallback(() => setCurrent((c) => (c + 1) % slides.length), []);
+ const prev = () => setCurrent((c) => (c - 1 + slides.length) % slides.length);
+
+ useEffect(() => {
+ const id = setInterval(next, 5000);
+ return () => clearInterval(id);
+ }, [next]);
+
+ return (
+
+ {/* Sliding track */}
+
+
+ {slides.map((slide) => {
+ const title = t(`${slide.key}.title`);
+ const description = t(`${slide.key}.description`);
+ return (
+
+ {/* Background image */}
+
+ {/* Overlay */}
+
+
+ {/* Content */}
+
+
+
+
+ {t("heading")}
+
+
+
+ {title}
+
+
+
+ {description}
+
+
+
+ {/* Hero image */}
+
+
+
+
+
+ );
+ })}
+
+
+ {/* Arrow buttons */}
+
+
+
+
+ {/* Navigation dots */}
+
+ {slides.map((_, i) => (
+
+
+ );
+}
diff --git a/translations/en.json b/translations/en.json
index 8d10954..91074eb 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -35,10 +35,35 @@
}
},
"home": {
- "title": "TipiLAN 2025",
+ "title": "TipiLAN 2026",
"subtitle": "Estonia's largest student-organized LAN event!",
- "welcome": "Welcome to TipiLAN 2025!",
+ "welcome": "Welcome to TipiLAN 2026!",
"description": "Join us at Estonia's largest student-organized LAN event. Games, competitions and much more await you!",
+ "hero": {
+ "date": "11–13 OCTOBER 2026",
+ "location": "TALTECH, EHITAJATE TEE 5",
+ "buyTicket": "BUY TICKETS",
+ "prizePool": "PRIZE POOL",
+ "award": "TALTECH STUDENT ACT OF THE YEAR 2025"
+ },
+ "teaser": {
+ "heading": "COME TO TIPILAN AND...",
+ "compete": {
+ "title": "COMPETE",
+ "description": "Prove yourself in TipiLAN's CS2 and LoL tournaments: thousands in prize money, players from across Europe, and HLTV-ranked competition that could put you on the map.",
+ "link": "/turniirid"
+ },
+ "play": {
+ "title": "PLAY",
+ "description": "Enjoy the TipiLAN atmosphere — bring your computer, relax, play with friends and experience one of Estonia's largest gaming events.",
+ "link": "/piletid"
+ },
+ "explore": {
+ "title": "EXPLORE",
+ "description": "Explore the TipiLAN expo area where companies, mini-competitions and lots more exciting things await you.",
+ "link": "/messiala"
+ }
+ },
"sections": {
"schedule": {
"description": "TipiLAN is packed with exciting tournaments, mini-competitions and much more."
@@ -51,8 +76,7 @@
},
"reserveSpot": "Reserve your spot today!",
"poweredBy": "TipiLAN is powered by...",
- "dateAndLocation": "24th-26th Oct. @ TalTech main building",
- "farewellMessage": "Thank you for partici\u00ADpating in TipiLAN 2025! We hope to see you again next time!"
+ "dateAndLocation": "11th–13th Oct. @ TalTech"
}
},
"tickets": {
diff --git a/translations/et.json b/translations/et.json
index 23dcd67..b798ddf 100644
--- a/translations/et.json
+++ b/translations/et.json
@@ -35,10 +35,35 @@
}
},
"home": {
- "title": "TipiLAN 2025",
+ "title": "TipiLAN 2026",
"subtitle": "Eesti suurim tudengite korraldatud LAN!",
- "welcome": "Tere tulemast TipiLAN 2025 sĂĽndmusele!",
+ "welcome": "Tere tulemast TipiLAN 2026 sĂĽndmusele!",
"description": "Liitu meiega Eesti suurimal tudengite korraldatud LAN-üritusel. Mängud, võistlused ja palju muud ootavad sind!",
+ "hero": {
+ "date": "11.–13. OKTOOBER 2026",
+ "location": "TALTECH, EHITAJATE TEE 5",
+ "buyTicket": "OSTA PILET",
+ "prizePool": "AUHINNAFOND",
+ "award": "TALTECHI AASTA TUDENGITEGU 2025"
+ },
+ "teaser": {
+ "heading": "TULE TIPILANILE JA...",
+ "compete": {
+ "title": "VÕISTLE",
+ "description": "Tõesta end TipiLANi CS2 ja LoL featurniiridel: tuhanded eurod auhinnarahas, mängijad üle kogu Euroopa ja HLTV-reitinguga võistlus, mis viib sind maailmakaardile.",
+ "link": "/turniirid"
+ },
+ "play": {
+ "title": "MÄNGI",
+ "description": "Naudi TipiLANi atmosfääri – too kaasa arvuti, istutle mugavalt, mängi sõpradega ja koge ühte Eesti suurimat mänguüritust.",
+ "link": "/piletid"
+ },
+ "explore": {
+ "title": "AVASTA",
+ "description": "Avasta TipiLANi messialat, kus ootavad sind erinevad ettevõtted, mini-võistlused ja palju muud põnevat.",
+ "link": "/messiala"
+ }
+ },
"sections": {
"schedule": {
"description": "TipiLAN on pungil põnevatest turniiridest, mini-võistlustest ja paljust muust."
@@ -51,8 +76,7 @@
},
"reserveSpot": "Broneeri oma koht juba täna!",
"poweredBy": "TipiLANi tõmbab käima...",
- "dateAndLocation": "24.-26. okt. TalTechi peahoones",
- "farewellMessage": "Aitäh, et olite osa TipiLAN 2025-st! Ootame teid tagasi järgmisele!"
+ "dateAndLocation": "11.–13. okt. TalTechis"
}
},
"tickets": {
diff --git a/tsconfig.json b/tsconfig.json
index c133409..b575f7d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ES2017",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -11,7 +15,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -19,9 +23,19 @@
}
],
"paths": {
- "@/*": ["./src/*"]
+ "@/*": [
+ "./src/*"
+ ]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}