diff --git a/public/images/landing/compete_hero.png b/public/images/landing/compete_hero.png new file mode 100644 index 0000000..680d4fa Binary files /dev/null and b/public/images/landing/compete_hero.png differ diff --git a/public/images/landing/compete_teaser.jpg b/public/images/landing/compete_teaser.jpg new file mode 100644 index 0000000..aa15dcd Binary files /dev/null and b/public/images/landing/compete_teaser.jpg differ diff --git a/public/images/landing/explore_hero.png b/public/images/landing/explore_hero.png new file mode 100644 index 0000000..61ed1f6 Binary files /dev/null and b/public/images/landing/explore_hero.png differ diff --git a/public/images/landing/explore_teaser.png b/public/images/landing/explore_teaser.png new file mode 100644 index 0000000..6ca7962 Binary files /dev/null and b/public/images/landing/explore_teaser.png differ diff --git a/public/images/landing/main_teaser.jpg b/public/images/landing/main_teaser.jpg new file mode 100644 index 0000000..23a43c1 Binary files /dev/null and b/public/images/landing/main_teaser.jpg differ diff --git a/public/images/landing/play_hero.png b/public/images/landing/play_hero.png new file mode 100644 index 0000000..ec8a6b1 Binary files /dev/null and b/public/images/landing/play_hero.png differ diff --git a/public/images/landing/play_teaser.png b/public/images/landing/play_teaser.png new file mode 100644 index 0000000..ba548c7 Binary files /dev/null and b/public/images/landing/play_teaser.png differ diff --git a/public/images/landing/student_award.png b/public/images/landing/student_award.png new file mode 100644 index 0000000..c41f0f1 Binary files /dev/null and b/public/images/landing/student_award.png differ diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index 677bbf3..394e961 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -1,8 +1,9 @@ import { vipnagorgialla } from "@/components/Vipnagorgialla"; import Sponsors from "@/components/Sponsors"; +import HeroSection from "@/components/HeroSection"; +import TeaserCarousel from "@/components/TeaserCarousel"; import { Link } from "@/i18n/routing"; import { getTranslations, setRequestLocale } from "next-intl/server"; -import Image from "next/image"; export default async function Home({ params, @@ -15,58 +16,22 @@ export default async function Home({ return (
- {/* Title */} -
- TipiLAN Logo - TipiLAN Logo -
-

- {t("tournaments.prizePool")} -

-

- 10 000€ -

-
+ {/* Hero */} +
+
- {/* Farewell message */} -
-
-

- {t("home.sections.farewellMessage")} 🩵 -

-
-
- - {/* Grid of buttons */} -
+ {/* Nav cards: Piletid + Turniirid */} +
-
+

- {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 */} +
+ TipiLAN Logo +
+

+ {t("hero.date")} +

+

+ {t("hero.location")} +

+
+ + {t("hero.buyTicket")} + +
+ + {/* Right: prize pool + award */} +
+
+

+ {t("hero.prizePool")} +

+

+ 10 000€ +

+
+
+ TalTech student award +

+ {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 */} + {slide.imageAlt} + {/* Overlay */} +
+ + {/* Content */} +
+
+
+

+ {t("heading")} +

+ +

+ {title} +

+ +

+ {description} +

+
+
+ {/* Hero image */} +
+ {slide.imageAlt} +
+
+
+ ); + })} +
+ + {/* 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" + ] }