mirror of https://github.com/Lapikud/tipilan
Merge pull request #48 from Lapikud/development
Add English translation, schedule programpull/56/head
commit
895585c9b5
33 changed files with 1661 additions and 878 deletions
@ -0,0 +1,81 @@ |
||||
"use client"; |
||||
|
||||
import { useState } from "react"; |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import { scheduleData } from "@/data/timetable"; |
||||
import SectionDivider from "@/components/SectionDivider"; |
||||
import { useTranslations } from "next-intl"; |
||||
|
||||
const tabs = Object.keys(scheduleData); |
||||
|
||||
export default function Timetable() { |
||||
const [activeTab, setActiveTab] = useState(tabs[0]); |
||||
const schedule = scheduleData[activeTab]; |
||||
const t = useTranslations(); |
||||
|
||||
return ( |
||||
<div> |
||||
<div className="flex flex-col min-h-[90vh] m-6 mt-16 md:m-16"> |
||||
<h1 |
||||
className={`text-5xl sm:text-6xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-8`} |
||||
> |
||||
{t("schedule.title")} |
||||
</h1> |
||||
|
||||
{/* Tab menu */} |
||||
<div className="flex space-x-4 mb-8"> |
||||
{tabs.map((tab) => ( |
||||
<button |
||||
key={tab} |
||||
onClick={() => setActiveTab(tab)} |
||||
className={`${vipnagorgialla.className} cursor-pointer uppercase italic px-4 py-2 text-lg font-semibold ${ |
||||
activeTab === tab |
||||
? "bg-[#00A3E0] text-white" |
||||
: "bg-[#007CAB] dark:bg-[#007CAB] text-[#EEE5E5] hover:bg-[#00A3E0] dark:hover:bg-[#007CAB]" |
||||
} transition-colors`}
|
||||
> |
||||
{t(`schedule.${tab}`)} |
||||
</button> |
||||
))} |
||||
</div> |
||||
|
||||
{/* Schedule entries */} |
||||
<div className="space-y-6"> |
||||
{schedule.map((item, idx) => ( |
||||
<div |
||||
key={idx} |
||||
className="border-l-3 border-[#007CAB] pl-4 flex flex-row flex-wrap gap-5 items-stretch" |
||||
> |
||||
<div |
||||
className={`${vipnagorgialla.className} text-[#00A3E0] text-4xl font-bold italic flex-shrink-0 flex items-center justify-center`} |
||||
style={{ width: "180px", minWidth: "180px" }} |
||||
> |
||||
{item.time} |
||||
</div> |
||||
<div |
||||
className="flex-1 flex flex-col justify-center min-h-[120px]" |
||||
style={{ minWidth: "0" }} |
||||
> |
||||
<div |
||||
className={`${vipnagorgialla.className} text-3xl italic font-bold text-[#2A2C3F] dark:text-[#EEE5E5] text-balance`} |
||||
> |
||||
{t(item.titleKey)} |
||||
</div> |
||||
{item.description && ( |
||||
<div className="text-2xl text-[#938BA1] dark:text-[#938BA1] text-balance"> |
||||
{item.description} |
||||
</div> |
||||
)} |
||||
<div className="text-2xl text-[#938BA1] dark:text-[#938BA1] text-balance"> |
||||
{t(item.locationKey)} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,38 @@ |
||||
import { NextIntlClientProvider } from "next-intl"; |
||||
import { setRequestLocale, getMessages } from "next-intl/server"; |
||||
import { ThemeProvider } from "@/components/Theme-provider"; |
||||
import SidebarParent from "@/components/SidebarParent"; |
||||
import Footer from "@/components/Footer"; |
||||
|
||||
export default async function LocaleLayout({ |
||||
children, |
||||
params, |
||||
}: Readonly<{ |
||||
children: React.ReactNode; |
||||
params: Promise<{ locale: string }>; |
||||
}>) { |
||||
const { locale } = await params; |
||||
|
||||
// Enable static rendering
|
||||
setRequestLocale(locale); |
||||
|
||||
// Provide messages for client-side components
|
||||
const messages = await getMessages(); |
||||
|
||||
return ( |
||||
<div lang={locale}> |
||||
<NextIntlClientProvider messages={messages}> |
||||
<ThemeProvider |
||||
attribute="class" |
||||
defaultTheme="system" |
||||
enableSystem |
||||
disableTransitionOnChange |
||||
> |
||||
<SidebarParent /> |
||||
{children} |
||||
<Footer /> |
||||
</ThemeProvider> |
||||
</NextIntlClientProvider> |
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,19 @@ |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import { getTranslations } from "next-intl/server"; |
||||
|
||||
export default async function NotFound() { |
||||
const t = await getTranslations("notFound"); |
||||
|
||||
return ( |
||||
<div className="flex flex-col min-h-[90vh] p-12 justify-center items-center"> |
||||
<h1 |
||||
className={`text-7xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 mb-4`} |
||||
> |
||||
{t("title")} |
||||
</h1> |
||||
<p className="text-2xl text-[#2A2C3F] dark:text-[#EEE5E5] mb-8"> |
||||
{t("message")} |
||||
</p> |
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,114 @@ |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import Link from "next/link"; |
||||
import SectionDivider from "@/components/SectionDivider"; |
||||
import { getTranslations, setRequestLocale } from "next-intl/server"; |
||||
|
||||
export default async function Tickets({ |
||||
params, |
||||
}: { |
||||
params: Promise<{ locale: string }>; |
||||
}) { |
||||
const { locale } = await params; |
||||
setRequestLocale(locale); |
||||
const t = await getTranslations({ locale }); |
||||
return ( |
||||
<div> |
||||
<div className="flex flex-col min-h-[90vh] m-6 mt-16 md:m-16"> |
||||
<h1 |
||||
className={`text-4xl md:text-5xl lg:text-6xl ${vipnagorgialla.className} font-bold italic text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-4`} |
||||
> |
||||
{t("tickets.title")} |
||||
</h1> |
||||
<div className="flex justify-center lg:items-center flex-col lg:flex-row gap-8 md:gap-12 flex-grow mb-16 md:mt-8 lg:mt-0"> |
||||
<div className="bg-[#007CAB] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
{t("tickets.computerParticipant.price")} |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
{t("tickets.computerParticipant.title")} |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#1F5673]"> |
||||
{t |
||||
.raw("tickets.computerParticipant.features") |
||||
.map((feature: string, index: number) => ( |
||||
<li key={index} className="text-xl italic"> |
||||
{feature} |
||||
</li> |
||||
))} |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
{t("tickets.buyTicket")} |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
<div className="bg-[#1F5673] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
{t("tickets.competitor.price")} |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
{t("tickets.competitor.title")} |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#007CAB]"> |
||||
{t |
||||
.raw("tickets.competitor.features") |
||||
.map((feature: string, index: number) => ( |
||||
<li key={index} className="text-xl"> |
||||
{feature} |
||||
</li> |
||||
))} |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
{t("tickets.buyTicket")} |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
|
||||
<div className="bg-[#007CAB] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
{t("tickets.visitor.price")} |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
{t("tickets.visitor.title")} |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#1F5673]"> |
||||
{t |
||||
.raw("tickets.visitor.features") |
||||
.map((feature: string, index: number) => ( |
||||
<li key={index} className="text-xl"> |
||||
{feature} |
||||
</li> |
||||
))} |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
{t("tickets.buyTicket")} |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,188 @@ |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import Link from "next/link"; |
||||
import Image from "next/image"; |
||||
import { getTranslations, setRequestLocale } from "next-intl/server"; |
||||
|
||||
export default async function Tourney({ |
||||
params, |
||||
}: { |
||||
params: Promise<{ locale: string }>; |
||||
}) { |
||||
const { locale } = await params; |
||||
setRequestLocale(locale); |
||||
const t = await getTranslations({ locale }); |
||||
const headingStyle = `text-3xl md:text-5xl lg:text-5xl ${vipnagorgialla.className} font-bold uppercase text-[#2A2C3F] dark:text-[#EEE5E5] -skew-x-2 md:-skew-x-5`; |
||||
|
||||
return ( |
||||
<div className="flex flex-col min-h-[90vh] mt-16"> |
||||
<h1 |
||||
className={`text-4xl md:text-5xl lg:text-6xl ${vipnagorgialla.className} font-bold italic uppercase
|
||||
text-[#2A2C3F] dark:text-[#EEE5E5] md:m-16`}
|
||||
> |
||||
{t("tournaments.title")} |
||||
</h1> |
||||
|
||||
<div className="flex flex-col"> |
||||
{/* CS2 turniir */} |
||||
<div className="hover:bg-[#007CAB] py-8 md:py-16 transition group"> |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="-skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}> |
||||
{t("tournaments.cs2.title")} |
||||
</h2> |
||||
<p |
||||
className={ |
||||
"text-2xl mb-4 text-neutral-500 group-hover:text-black" |
||||
} |
||||
> |
||||
{t("tournaments.cs2.timing")} |
||||
</p> |
||||
<p className="text-balance"> |
||||
{t("tournaments.cs2.description1")} |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
{t("tournaments.cs2.description2")} |
||||
</p> |
||||
<br /> |
||||
|
||||
<div className={"flex flex-row flex-wrap gap-8"}> |
||||
<Link href="/reeglid/cs2" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.cs2.readRules")} |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] group-hover:bg-black cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.cs2.buyTicket")} |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/cs2_tournament_logo.png" |
||||
alt="CS2 tournament" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
{/* LoL turniir */} |
||||
<div className="hover:bg-[#007CAB] py-8 md:py-16 border-t-[3px] border-[#1F5673] transition group"> |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/lol_tournament_logo.png" |
||||
alt="LoL tournament" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
<div className="flex-auto text-right -skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}> |
||||
{t("tournaments.lol.title")} |
||||
</h2> |
||||
<p |
||||
className={ |
||||
"text-2xl mb-4 text-neutral-500 group-hover:text-black" |
||||
} |
||||
> |
||||
{t("tournaments.lol.timing")} |
||||
</p> |
||||
<p className="text-balance"> |
||||
{t("tournaments.lol.description1")} |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
{t("tournaments.lol.description2")} |
||||
</p> |
||||
<br /> |
||||
<div className="flex flex-row flex-wrap gap-4 md:gap-8 justify-end"> |
||||
<Link href="/reeglid/lol" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.lol.readRules")} |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] group-hover:bg-black cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.lol.buyTicket")} |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
{/* Mini-turniirid */} |
||||
<div className="hover:bg-[#007CAB] py-8 md:py-16 border-t-[3px] border-b-[3px] border-[#1F5673] transition group"> |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="-skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}> |
||||
{t("tournaments.mini.title")} |
||||
</h2> |
||||
<p |
||||
className={ |
||||
"text-2xl mb-4 text-neutral-500 group-hover:text-black" |
||||
} |
||||
> |
||||
{t("tournaments.mini.timing")} |
||||
</p> |
||||
<p className="text-balance"> |
||||
{t("tournaments.mini.description1")} |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
{t("tournaments.mini.description2")} |
||||
</p> |
||||
<br /> |
||||
<div className="flex flex-row flex-wrap gap-4 md:gap-8"> |
||||
<Link href="/kodukord" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.mini.readRules")} |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] group-hover:bg-black cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
{t("tournaments.mini.buyTicket")} |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/minitournament_logo.png" |
||||
alt="mini tournaments" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
@ -1,77 +0,0 @@ |
||||
"use client"; |
||||
|
||||
import {useState} from "react"; |
||||
import {vipnagorgialla} from "@/components/Vipnagorgialla"; |
||||
import {scheduleData} from "@/data/timetable"; |
||||
import SectionDivider from "@/components/SectionDivider"; |
||||
|
||||
const tabs = Object.keys(scheduleData); |
||||
|
||||
export default function Timetable() { |
||||
const [activeTab, setActiveTab] = useState(tabs[0]); |
||||
const schedule = scheduleData[activeTab]; |
||||
|
||||
return ( |
||||
<div> |
||||
<div className="flex flex-col min-h-[90vh] m-6 mt-16 md:m-16"> |
||||
<h1 |
||||
className={`text-5xl sm:text-6xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-8`} |
||||
> |
||||
Ajakava |
||||
</h1> |
||||
|
||||
{/* Tab menu */} |
||||
<div className="flex space-x-4 mb-8"> |
||||
{tabs.map((tab) => ( |
||||
<button |
||||
key={tab} |
||||
onClick={() => setActiveTab(tab)} |
||||
className={`${vipnagorgialla.className} uppercase italic px-4 py-2 text-lg font-semibold ${ |
||||
activeTab === tab |
||||
? "bg-[#00A3E0] text-white" |
||||
: "bg-[#007CAB] dark:bg-[#007CAB] text-[#EEE5E5] hover:bg-[#00A3E0] dark:hover:bg-[#007CAB]" |
||||
} transition-colors`}
|
||||
> |
||||
{tab} |
||||
</button> |
||||
))} |
||||
</div> |
||||
|
||||
{/* Schedule entries */} |
||||
<div className="space-y-6"> |
||||
{schedule.map((item, idx) => ( |
||||
<div |
||||
key={idx} |
||||
className="border-l-3 border-[#007CAB] pl-4 flex flex-row gap-12" |
||||
> |
||||
<div |
||||
className={` ${vipnagorgialla.className} text-[#00A3E0] text-5xl font-bold italic`} |
||||
> |
||||
{item.time} |
||||
</div> |
||||
<div> |
||||
<div |
||||
className={`${vipnagorgialla.className} text-4xl italic font-bold text-[#2A2C3F] dark:text-[#EEE5E5]`} |
||||
> |
||||
{item.title} |
||||
</div> |
||||
{item.description && ( |
||||
<div className="text-2xl text-[#938BA1] dark:text-[#938BA1]"> |
||||
{item.description} |
||||
</div> |
||||
)} |
||||
{item.location && ( |
||||
<div className="text-2xl text-[#938BA1] dark:text-[#938BA1]"> |
||||
{item.location} |
||||
</div> |
||||
)} |
||||
</div> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider/> |
||||
</div> |
||||
); |
||||
} |
||||
@ -1,10 +1,29 @@ |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import { ThemeProvider } from "@/components/Theme-provider"; |
||||
|
||||
export default function NotFound() { |
||||
return ( |
||||
<div className="flex flex-col min-h-[90vh] p-12 justify-center items-center"> |
||||
<h1 className={`text-7xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 mb-4`}>404</h1> |
||||
<p className="text-2xl text-[#2A2C3F] dark:text-[#EEE5E5]">Seda lehte me ei leidnud.</p> |
||||
return ( |
||||
<ThemeProvider |
||||
attribute="class" |
||||
defaultTheme="system" |
||||
enableSystem |
||||
disableTransitionOnChange |
||||
> |
||||
<div className="flex flex-col min-h-[90vh] p-12 justify-center items-center"> |
||||
<h1 |
||||
className={`text-7xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 mb-4`} |
||||
> |
||||
404 |
||||
</h1> |
||||
<div className="text-center"> |
||||
<p className="text-2xl text-[#2A2C3F] dark:text-[#EEE5E5] mb-2"> |
||||
Lehte ei leitud! |
||||
</p> |
||||
<p className="text-lg text-[#2A2C3F]/80 dark:text-[#EEE5E5]/80"> |
||||
Page not found! |
||||
</p> |
||||
</div> |
||||
); |
||||
</div> |
||||
</ThemeProvider> |
||||
); |
||||
} |
||||
|
||||
@ -1,105 +0,0 @@ |
||||
import {vipnagorgialla} from "@/components/Vipnagorgialla"; |
||||
import Link from "next/link"; |
||||
import SectionDivider from "@/components/SectionDivider"; |
||||
|
||||
export default function Tickets() { |
||||
return ( |
||||
<div> |
||||
<div className="flex flex-col min-h-[90vh] m-6 mt-16 md:m-16"> |
||||
<h1 |
||||
className={`text-4xl md:text-5xl lg:text-6xl ${vipnagorgialla.className} font-bold italic text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-4`} |
||||
> |
||||
PILETID JA REGIS­TREERIMINE |
||||
</h1> |
||||
<div |
||||
className="flex justify-center lg:items-center flex-col lg:flex-row gap-8 md:gap-12 flex-grow mb-16 md:mt-8 lg:mt-0"> |
||||
<div |
||||
className="bg-[#007CAB] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
8€ |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
Arvutiga osaleja |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#1F5673]"> |
||||
<li className="text-xl italic"> |
||||
Isiklik laud, voolu- ja internetiühendus |
||||
</li> |
||||
<li className="text-xl">Ligipääs demoalale</li> |
||||
<li className="text-xl">Turniiride pealt vaatamine</li> |
||||
<li className="text-xl">Võimalus osaleda miniturniiridel</li> |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
<div |
||||
className="bg-[#1F5673] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
12-15€ |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
Võistleja |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#007CAB]"> |
||||
<li className="text-xl">Võimalus osaleda CS2 või LoL turniiril</li> |
||||
<li className="text-xl"> |
||||
Isiklik laud, voolu- ja internetiühendus |
||||
</li> |
||||
<li className="text-xl">Ligipääs demoalale</li> |
||||
<li className="text-xl">Turniiride pealt vaatamine</li> |
||||
<li className="text-xl">Võimalus osaleda miniturniiridel</li> |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
|
||||
<div |
||||
className="bg-[#007CAB] -skew-x-2 md:-skew-x-5 text-white px-8 md:px-12 py-16 hover:scale-103 transition-all duration-150 w-full md:w-xl lg:w-[400px]"> |
||||
<h2 |
||||
className={`text-6xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-2`} |
||||
> |
||||
6€ |
||||
</h2> |
||||
<h3 |
||||
className={`text-3xl ${vipnagorgialla.className} font-bold italic text-[#EEE5E5] pb-4`} |
||||
> |
||||
Külastaja |
||||
</h3> |
||||
<ul className="pl-4 mb-8 list-[square] marker:text-[#1F5673]"> |
||||
<li className="text-xl">Ligipääs demoalale</li> |
||||
<li className="text-xl">Turniiride pealt vaatamine</li> |
||||
<li className="text-xl">Võimalus osaleda miniturniiridel</li> |
||||
</ul> |
||||
<Link href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</Link> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
</div> |
||||
); |
||||
} |
||||
@ -1,181 +0,0 @@ |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import Link from "next/link"; |
||||
import Image from "next/image"; |
||||
import SectionDivider from "@/components/SectionDivider"; |
||||
|
||||
export default function Tourney() { |
||||
const headingStyle = `text-3xl md:text-5xl lg:text-5xl ${vipnagorgialla.className} font-bold uppercase text-[#2A2C3F] dark:text-[#EEE5E5] -skew-x-2 md:-skew-x-5`; |
||||
|
||||
// const SectionDivider = () => <hr className="border-t-[3px] border-[#1F5673]" />;
|
||||
|
||||
return ( |
||||
<div className="flex flex-col min-h-[90vh] mt-16"> |
||||
<h1 |
||||
className={`text-4xl md:text-5xl lg:text-6xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-4 m-6 md:m-16`} |
||||
> |
||||
Turniirid |
||||
</h1> |
||||
|
||||
{/*<p className="text-2xl text-[#2A2C3F] dark:text-[#EEE5E5]">*/} |
||||
{/* Kui tahate oma oskusi proovile panna, siis vaadake siia tagasi! Rohkem*/} |
||||
{/* infot lähiajal.*/} |
||||
{/*</p>*/} |
||||
|
||||
<div className="flex flex-col gap-8 md:gap-16"> |
||||
{/* CS2 turniir */} |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="-skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}>CS2 turniir</h2> |
||||
<p className={"text-2xl mb-4 text-neutral-500"}> |
||||
Toimumisaeg veel selgumisel |
||||
</p> |
||||
<p className="text-balance"> |
||||
TipiLANil toimub Eesti ühe suurima auhinnafondiga CS2 turniire |
||||
juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest |
||||
kogemusest! |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
Auhinnafond on suuruses 5250€, mis jaotatakse TOP3 meeskonna vahel |
||||
ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas |
||||
600€, 300€ või 150€. |
||||
</p> |
||||
<br /> |
||||
|
||||
<div className={"flex flex-row flex-wrap gap-8"}> |
||||
<Link href="/reeglid/cs2" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
LOE REEGLEID |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/cs2_tournament_logo.png" |
||||
alt="CS2 tournament" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
|
||||
{/* LoL turniir */} |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/lol_tournament_logo.png" |
||||
alt="LoL tournament" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
<div className="flex-auto text-right -skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}>LoL turniir</h2> |
||||
<p className={"text-2xl mb-4 text-neutral-500"}> |
||||
Toimumisaeg veel selgumisel |
||||
</p> |
||||
<p className="text-balance"> |
||||
TipiLANil toimub Eesti ühe suurima auhinnafondiga LoL turniire |
||||
juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest |
||||
kogemusest! |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
Auhinnafond on suuruses 3500€, mis jaotatakse TOP3 meeskonna vahel |
||||
ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas |
||||
400€, 200€ või 100€. |
||||
</p> |
||||
<br /> |
||||
<div className="flex flex-row flex-wrap gap-4 md:gap-8 justify-end"> |
||||
<Link href="/kodukord" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
LOE REEGLEID |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
|
||||
{/* Mini-turniirid */} |
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center mx-8 md:mx-16 lg:mx-32 xl:mx-48"> |
||||
<div className="-skew-x-2 md:-skew-x-5"> |
||||
<h2 className={`${headingStyle}`}>Mini­turniirid</h2> |
||||
<p className={"text-2xl mb-4 text-neutral-500"}> |
||||
Toimumisaeg veel selgumisel |
||||
</p> |
||||
<p className="text-balance"> |
||||
TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu |
||||
tekitavaid miniturniire. Miniturniirid toimuvad järgnevates |
||||
mängudes: SimRacing, Tekken, FIFA, Minecraft Bedwars, Buckshot |
||||
Roulette, LostGamer ja palju muud. |
||||
</p> |
||||
<br /> |
||||
<p className="text-balance"> |
||||
Auhinnafond on kõigi turniiride peale 1250€ ja reeglina saab |
||||
rahalise auhinna miniturniiri võitja. |
||||
</p> |
||||
<br /> |
||||
<div className="flex flex-row flex-wrap gap-4 md:gap-8"> |
||||
<Link href="/kodukord" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#1F5673] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
LOE REEGLEID |
||||
</button> |
||||
</Link> |
||||
<a href="https://fienta.com/et/tipilan" target="_blank"> |
||||
<button |
||||
className={`px-4 py-2 bg-[#007CAB] cursor-pointer ${vipnagorgialla.className} font-bold italic text-[#ECE5E5]`} |
||||
> |
||||
OSTA PILET |
||||
</button> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<div className="hidden md:block"> |
||||
<div> |
||||
{/* Outside div needs to remain so that overflow won't occur*/} |
||||
<Image |
||||
src="/images/minitournament_logo.png" |
||||
alt="mini tournaments" |
||||
width={600} |
||||
height={400} |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<SectionDivider /> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
@ -1,111 +1,118 @@ |
||||
import { SiDiscord, SiInstagram, SiFacebook } from "react-icons/si"; |
||||
import Image from "next/image"; |
||||
import { useTranslations } from "next-intl"; |
||||
|
||||
// Fonts
|
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
|
||||
const Footer = () => ( |
||||
<div className="flex flex-col justify-center sm:justify-between px-6 py-8 md:px-12 md:py-16 gap-4 md:gap-8"> |
||||
<div className="flex md:items-center gap-8 md:gap-0 justify-between flex-col md:flex-row"> |
||||
<div className="flex flex-col items-start md:items-center"> |
||||
<Image |
||||
src="/tipilan-white.svg" |
||||
width={250} |
||||
height={36} |
||||
alt="TipiLAN Logo" |
||||
className="h-9 dark:hidden" |
||||
/> |
||||
<Image |
||||
src="/tipilan-dark.svg" |
||||
width={250} |
||||
height={36} |
||||
alt="TipiLAN Logo" |
||||
className="h-9 not-dark:hidden" |
||||
/> |
||||
</div> |
||||
{/* Social media */} |
||||
<div className="flex flex-row"> |
||||
<a |
||||
href="https://discord.gg/eB7sVqgJ9b" |
||||
target="_blank" |
||||
className="mx-4 ml-0 md:ml-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiDiscord |
||||
title="Discord" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
/> |
||||
</a> |
||||
<a |
||||
href="https://instagram.com/tipilan.ee" |
||||
target="_blank" |
||||
className="mx-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiInstagram |
||||
title="Instagram" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
const Footer = () => { |
||||
const t = useTranslations(); |
||||
|
||||
return ( |
||||
<div className="flex flex-col justify-center sm:justify-between px-6 py-8 md:px-12 md:py-16 gap-4 md:gap-8"> |
||||
<div className="flex md:items-center gap-8 md:gap-0 justify-between flex-col md:flex-row"> |
||||
<div className="flex flex-col items-start md:items-center"> |
||||
<Image |
||||
src="/tipilan-white.svg" |
||||
width={250} |
||||
height={36} |
||||
alt="TipiLAN Logo" |
||||
className="h-9 dark:hidden" |
||||
/> |
||||
</a> |
||||
<a |
||||
href="https://facebook.com/tipilan.ee" |
||||
target="_blank" |
||||
className="mx-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiFacebook |
||||
title="Facebook" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
<Image |
||||
src="/tipilan-dark.svg" |
||||
width={250} |
||||
height={36} |
||||
alt="TipiLAN Logo" |
||||
className="h-9 not-dark:hidden" |
||||
/> |
||||
</a> |
||||
</div> |
||||
{/* Social media */} |
||||
<div className="flex flex-row"> |
||||
<a |
||||
href="https://discord.gg/eB7sVqgJ9b" |
||||
target="_blank" |
||||
className="mx-4 ml-0 md:ml-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiDiscord |
||||
title="Discord" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
/> |
||||
</a> |
||||
<a |
||||
href="https://instagram.com/tipilan.ee" |
||||
target="_blank" |
||||
className="mx-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiInstagram |
||||
title="Instagram" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
/> |
||||
</a> |
||||
<a |
||||
href="https://facebook.com/tipilan.ee" |
||||
target="_blank" |
||||
className="mx-4" |
||||
rel="noopener noreferrer" |
||||
> |
||||
<SiFacebook |
||||
title="Facebook" |
||||
size={"2em"} |
||||
className="text-[#2A2C3F] dark:text-[#EEE5E5]" |
||||
/> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div className="flex flex-col"> |
||||
<h2 |
||||
className={`text-3xl sm:text-4xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 mb-4`} |
||||
> |
||||
Kontakt |
||||
</h2> |
||||
<div className="flex flex-row justify-between gap-4 items-center"> |
||||
<div> |
||||
<h3 className="text-xl font-bold">IT-teaduskonna üliõpilaskogu</h3> |
||||
<div className="flex flex-col gap-2 mt-2"> |
||||
<div className="flex flex-row gap-2"> |
||||
<span className="material-symbols-outlined !font-bold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
mail |
||||
</span> |
||||
<a href="mailto:kontakt@ituk.ee" className="underline"> |
||||
tipilan@ituk.ee |
||||
</a> |
||||
<div className="flex flex-col"> |
||||
<h2 |
||||
className={`text-3xl sm:text-4xl ${vipnagorgialla.className} font-bold italic uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 mb-4`} |
||||
> |
||||
{t("footer.contact")} |
||||
</h2> |
||||
<div className="flex flex-row justify-between gap-4 items-center"> |
||||
<div> |
||||
<h3 className="text-xl font-bold">{t("footer.studentUnion")}</h3> |
||||
<div className="flex flex-col gap-2 mt-2"> |
||||
<div className="flex flex-row gap-2"> |
||||
<span className="material-symbols-outlined !font-bold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
mail |
||||
</span> |
||||
<a href="mailto:kontakt@ituk.ee" className="underline"> |
||||
tipilan@ituk.ee |
||||
</a> |
||||
</div> |
||||
<div className="flex flex-row gap-2"> |
||||
<span className="material-symbols-outlined !font-bold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
phone |
||||
</span> |
||||
<a href="tel:+37256931193" className="underline"> |
||||
+372 5693 1193 |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<div className="flex flex-row gap-2"> |
||||
<span className="material-symbols-outlined !font-bold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
phone |
||||
</span> |
||||
<a href="tel:+37256931193" className="underline"> |
||||
+372 5693 1193 |
||||
</a> |
||||
<h3 className="text-xl font-bold pt-4"> |
||||
{t("footer.organization")} |
||||
</h3> |
||||
<div> |
||||
<p className="text-[#aaa]"> |
||||
{t("footer.registrationCode")}:{" "} |
||||
<span className="font-semibold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
80391807 |
||||
</span> |
||||
</p> |
||||
<p className="text-[#aaa]"> |
||||
ICO-210, Raja tn 4c, Tallinn, Harjumaa, 12616 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
<h3 className="text-xl font-bold pt-4">MTÜ For Tsükkel</h3> |
||||
<div> |
||||
<p className="text-[#aaa]"> |
||||
Registrikood:{" "} |
||||
<span className="font-semibold text-[#007CAB] dark:text-[#00A3E0]"> |
||||
80391807 |
||||
</span> |
||||
</p> |
||||
<p className="text-[#aaa]"> |
||||
ICO-210, Raja tn 4c, Tallinn, Harjumaa, 12616 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
); |
||||
}; |
||||
|
||||
export default Footer; |
||||
|
||||
@ -0,0 +1,47 @@ |
||||
"use client"; |
||||
|
||||
import { useLocale } from "next-intl"; |
||||
import { useRouter, usePathname } from "@/i18n/routing"; |
||||
import { routing } from "@/i18n/routing"; |
||||
import { Button } from "@/components/ui/button"; |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
|
||||
export default function LanguageSwitcher() { |
||||
const locale = useLocale(); |
||||
const router = useRouter(); |
||||
const pathname = usePathname(); |
||||
|
||||
const getNextLocale = (): "et" | "en" => { |
||||
const currentIndex = routing.locales.indexOf(locale as "et" | "en"); |
||||
const nextIndex = (currentIndex + 1) % routing.locales.length; |
||||
return routing.locales[nextIndex] as "et" | "en"; |
||||
}; |
||||
|
||||
const getNextLanguageName = () => { |
||||
const nextLocale = getNextLocale(); |
||||
switch (nextLocale) { |
||||
case "et": |
||||
return "EST"; |
||||
case "en": |
||||
return "ENG"; |
||||
default: |
||||
return nextLocale; |
||||
} |
||||
}; |
||||
|
||||
const handleLanguageSwitch = () => { |
||||
const nextLocale = getNextLocale(); |
||||
router.replace(pathname, { locale: nextLocale }); |
||||
}; |
||||
|
||||
return ( |
||||
<Button |
||||
onClick={handleLanguageSwitch} |
||||
variant="ghost" |
||||
size="lg" |
||||
className={`${vipnagorgialla.className} text-3xl font-bold italic uppercase hover:bg-[#007CAB]/10 dark:hover:bg-[#00A3E0]/10 text-[#007CAB] dark:text-[#00A3E0] hover:text-[#2A2C3F] dark:hover:text-[#EEE5E5] transition-colors`} |
||||
> |
||||
{getNextLanguageName()} |
||||
</Button> |
||||
); |
||||
} |
||||
@ -1,88 +0,0 @@ |
||||
"use client"; |
||||
|
||||
// Fonts
|
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
|
||||
// Use effect to handle route changes and close the sidebar if it's open
|
||||
// usePathName to listen to route changes in Next.js
|
||||
import { useEffect } from "react"; |
||||
import { usePathname } from "next/navigation"; |
||||
import Link from "next/link"; |
||||
|
||||
const Sidebar = ({ |
||||
isOpen, |
||||
toggleSidebar, |
||||
}: { |
||||
isOpen: boolean; |
||||
toggleSidebar: () => void; |
||||
}) => { |
||||
const pathname = usePathname(); |
||||
|
||||
useEffect(() => { |
||||
if (isOpen) { |
||||
toggleSidebar(); |
||||
} |
||||
}, [pathname]); |
||||
|
||||
return ( |
||||
<> |
||||
<div |
||||
className="fixed inset-0 backdrop-blur mt-16 z-20" |
||||
style={{ display: isOpen ? "block" : "none" }} |
||||
onClick={toggleSidebar} // Close sidebar when clicking outside
|
||||
></div> |
||||
<div |
||||
className={`text-3xl md:text-5xl ${vipnagorgialla.className} font-bold italic uppercase fixed flex items-start xs:pl-25 pl-20 sm:pl-20 md:pl-24 flex-col gap-8 pt-16 top-0 left-0 h-[99vh] mt-16 -skew-x-5 border-r-3 border-[#1F5673] w-screen sm:w-96 md:w-128 bg-[#EEE5E5] dark:bg-[#0E0F19] text-[#2A2C3F] dark:text-[#EEE5E5] transition-transform transform z-20`} |
||||
style={{ |
||||
transform: isOpen |
||||
? "translateX(-13%) skewX(calc(5deg * -1)" |
||||
: "translateX(-150%) skewX(calc(5deg * -1)", |
||||
}} |
||||
> |
||||
<Link href="/" className="hover:text-[#00A3E0] transition duration-150"> |
||||
Avaleht |
||||
</Link> |
||||
<Link |
||||
href="/messiala" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Messiala |
||||
</Link> |
||||
<Link |
||||
href="/piletid" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Piletid |
||||
</Link> |
||||
<Link |
||||
href="/ajakava" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Ajakava |
||||
</Link> |
||||
<Link |
||||
href="/turniirid" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Turniirid |
||||
</Link> |
||||
<Link |
||||
href="/kodukord" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Kodukord |
||||
</Link> |
||||
<Link
|
||||
href="/reeglid" |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
Reeglid |
||||
</Link> |
||||
|
||||
|
||||
</div> |
||||
</> |
||||
); |
||||
}; |
||||
|
||||
export default Sidebar; |
||||
@ -0,0 +1,84 @@ |
||||
"use client"; |
||||
|
||||
import { useState, useEffect } from "react"; |
||||
import { usePathname } from "@/i18n/routing"; |
||||
import { Link } from "@/i18n/routing"; |
||||
import { vipnagorgialla } from "@/components/Vipnagorgialla"; |
||||
import Header from "./Header"; |
||||
|
||||
interface NavItem { |
||||
href: |
||||
| "/" |
||||
| "/ajakava" |
||||
| "/haldus" |
||||
| "/kodukord" |
||||
| "/messiala" |
||||
| "/piletid" |
||||
| "/reeglid" |
||||
| "/striim" |
||||
| "/turniirid"; |
||||
label: string; |
||||
} |
||||
|
||||
interface SidebarLayoutClientProps { |
||||
themeLabels: { |
||||
light: string; |
||||
dark: string; |
||||
system: string; |
||||
}; |
||||
navItems: NavItem[]; |
||||
} |
||||
|
||||
export default function SidebarLayoutClient({ |
||||
themeLabels, |
||||
navItems, |
||||
}: SidebarLayoutClientProps) { |
||||
const [isOpen, setIsOpen] = useState(false); |
||||
const pathname = usePathname(); |
||||
|
||||
const toggleSidebar = () => setIsOpen(!isOpen); |
||||
|
||||
// Close sidebar when route changes
|
||||
useEffect(() => { |
||||
if (isOpen) { |
||||
setIsOpen(false); |
||||
} |
||||
}, [pathname]); |
||||
|
||||
return ( |
||||
<> |
||||
<Header |
||||
isOpen={isOpen} |
||||
onToggle={toggleSidebar} |
||||
themeLabels={themeLabels} |
||||
/> |
||||
|
||||
{/* Sidebar */} |
||||
<> |
||||
<div |
||||
className="fixed inset-0 backdrop-blur mt-16 z-20" |
||||
style={{ display: isOpen ? "block" : "none" }} |
||||
onClick={() => setIsOpen(false)} |
||||
></div> |
||||
<div |
||||
className={`text-3xl md:text-4xl ${vipnagorgialla.className} font-bold break-all italic uppercase fixed flex items-start xs:pl-25 pl-20 sm:pl-20 md:pl-24 flex-col gap-8 pt-16 top-0 left-0 h-[99vh] mt-16 -skew-x-5 border-r-3 border-[#1F5673] w-screen sm:w-96 md:w-128 bg-[#EEE5E5] dark:bg-[#0E0F19] text-[#2A2C3F] dark:text-[#EEE5E5] transition-transform transform z-20`} |
||||
style={{ |
||||
transform: isOpen |
||||
? "translateX(-13%) skewX(calc(5deg * -1)" |
||||
: "translateX(-150%) skewX(calc(5deg * -1)", |
||||
}} |
||||
> |
||||
{navItems.map((item) => ( |
||||
<Link |
||||
key={item.href} |
||||
href={item.href} |
||||
className="hover:text-[#00A3E0] transition duration-150" |
||||
> |
||||
{item.label} |
||||
</Link> |
||||
))} |
||||
</div> |
||||
</> |
||||
</> |
||||
); |
||||
} |
||||
@ -0,0 +1,26 @@ |
||||
import { getTranslations } from "next-intl/server"; |
||||
import SidebarLayoutClient from "./SidebarLayoutClient"; |
||||
|
||||
export default async function SidebarLayoutServer() { |
||||
const t = await getTranslations("common"); |
||||
|
||||
const themeLabels = { |
||||
light: t("theme.light"), |
||||
dark: t("theme.dark"), |
||||
system: t("theme.system"), |
||||
}; |
||||
|
||||
const navT = await getTranslations("navigation"); |
||||
|
||||
const navItems = [ |
||||
{ href: "/" as const, label: navT("home") }, |
||||
{ href: "/messiala" as const, label: navT("expo") }, |
||||
{ href: "/piletid" as const, label: navT("tickets") }, |
||||
{ href: "/ajakava" as const, label: navT("schedule") }, |
||||
{ href: "/turniirid" as const, label: navT("tournaments") }, |
||||
{ href: "/kodukord" as const, label: navT("houserules") }, |
||||
{ href: "/reeglid" as const, label: navT("rules") }, |
||||
]; |
||||
|
||||
return <SidebarLayoutClient themeLabels={themeLabels} navItems={navItems} />; |
||||
} |
||||
@ -1,22 +1,14 @@ |
||||
'use client'; |
||||
|
||||
import { useState } from "react"; |
||||
import Header from "./Header"; |
||||
import Sidebar from "./Sidebar"; |
||||
import SidebarLayoutServer from "./SidebarLayoutServer"; |
||||
|
||||
const SidebarParent = () => { |
||||
const [isOpen, setIsOpen] = useState(false); |
||||
const toggleSidebar = () => setIsOpen(!isOpen); |
||||
|
||||
return ( |
||||
<div className="fixed w-screen top-0 z-9999"> |
||||
<Header isOpen={isOpen} toggleSidebar={toggleSidebar} /> |
||||
<Sidebar isOpen={isOpen} toggleSidebar={toggleSidebar}/> |
||||
</div> |
||||
); |
||||
return ( |
||||
<div className="fixed w-screen top-0 z-9999"> |
||||
<SidebarLayoutServer /> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
// This component is responsible for rendering the sidebar and header together.
|
||||
// It manages the state of the sidebar (open/closed) and passes the necessary props to both the Header and Sidebar components.
|
||||
// Server-side translations are handled by SidebarLayoutServer.
|
||||
|
||||
export default SidebarParent; |
||||
@ -1,33 +1,68 @@ |
||||
export type ScheduleItem = { |
||||
time?: string; // Aeg on ajutine praegu kuna pole 100% kindlalt paigas
|
||||
title: string; |
||||
location: string; |
||||
titleKey: string; |
||||
locationKey: string; |
||||
description?: string; |
||||
}; |
||||
|
||||
export const scheduleData: Record<string, ScheduleItem[]> = { |
||||
"24. oktoober": [ |
||||
oct24: [ |
||||
{ |
||||
title: "League of Legends põhiturniir", |
||||
location: "Aula", |
||||
time: "-", |
||||
titleKey: "schedule.events.doorsOpen", |
||||
locationKey: "schedule.locations.registrationSetup", |
||||
time: "17:00", |
||||
}, |
||||
{ |
||||
title: "Miniturniirid", |
||||
location: "Tudengimaja", |
||||
time: "-", |
||||
titleKey: "schedule.events.mainTournamentsStart", |
||||
locationKey: "schedule.locations.auditorium", |
||||
time: "20:00", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.miniTournamentsKickoff", |
||||
locationKey: "schedule.locations.studentHouse", |
||||
time: "18:00", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.fightingGamesStart", |
||||
locationKey: "schedule.locations.studentHouse", |
||||
time: "18:30", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.doorsClose", |
||||
locationKey: "schedule.locations.auditoriumAndStudentHouse", |
||||
time: "*01:00", |
||||
}, |
||||
], |
||||
"25. oktoober": [ |
||||
oct25: [ |
||||
{ |
||||
titleKey: "schedule.events.doorsOpen", |
||||
locationKey: "schedule.locations.auditoriumAndStudentHouse", |
||||
time: "10:00", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.miniTournamentsStart", |
||||
locationKey: "schedule.locations.studentHouse", |
||||
time: "11:00", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.granblue", |
||||
locationKey: "schedule.locations.studentHouse", |
||||
time: "11:30", |
||||
}, |
||||
{ |
||||
titleKey: "schedule.events.mainTournamentsStart", |
||||
locationKey: "schedule.locations.auditorium", |
||||
time: "12:00", |
||||
}, |
||||
{ |
||||
title: "Counter-Strike 2 põhiturniir", |
||||
location: "Aula", |
||||
time: "-", |
||||
titleKey: "schedule.events.granTurismo", |
||||
locationKey: "schedule.locations.studentHouse", |
||||
time: "20:00", |
||||
}, |
||||
{ |
||||
title: "Miniturniirid", |
||||
location: "Tudengimaja", |
||||
time: "-", |
||||
titleKey: "schedule.events.doorsClose", |
||||
locationKey: "schedule.locations.auditoriumAndStudentHouse", |
||||
time: "*01:00", |
||||
}, |
||||
], |
||||
}; |
||||
|
||||
@ -0,0 +1,17 @@ |
||||
import { getRequestConfig } from "next-intl/server"; |
||||
import { routing } from "./routing"; |
||||
|
||||
export default getRequestConfig(async ({ requestLocale }) => { |
||||
// This typically corresponds to the `[locale]` segment
|
||||
let locale = await requestLocale; |
||||
|
||||
// Ensure that a valid locale is used
|
||||
if (!locale || !routing.locales.includes(locale as "et" | "en")) { |
||||
locale = routing.defaultLocale; |
||||
} |
||||
|
||||
return { |
||||
locale: locale!, |
||||
messages: (await import(`../../translations/${locale}.json`)).default, |
||||
}; |
||||
}); |
||||
@ -0,0 +1,55 @@ |
||||
import { defineRouting } from "next-intl/routing"; |
||||
import { createNavigation } from "next-intl/navigation"; |
||||
|
||||
export const routing = defineRouting({ |
||||
// A list of all locales that are supported
|
||||
locales: ["et", "en"], |
||||
|
||||
// Used when no locale matches
|
||||
defaultLocale: "et", |
||||
|
||||
// The `pathnames` object holds pairs of internal and
|
||||
// external paths. The external paths are shown in the URL.
|
||||
pathnames: { |
||||
// If all locales use the same pathname, a single
|
||||
// external path can be used for all locales
|
||||
"/": "/", |
||||
"/ajakava": { |
||||
et: "/ajakava", |
||||
en: "/schedule", |
||||
}, |
||||
"/haldus": { |
||||
et: "/haldus", |
||||
en: "/admin", |
||||
}, |
||||
"/kodukord": { |
||||
et: "/kodukord", |
||||
en: "/rules", |
||||
}, |
||||
"/messiala": { |
||||
et: "/messiala", |
||||
en: "/expo", |
||||
}, |
||||
"/piletid": { |
||||
et: "/piletid", |
||||
en: "/tickets", |
||||
}, |
||||
"/reeglid": { |
||||
et: "/reeglid", |
||||
en: "/regulations", |
||||
}, |
||||
"/striim": { |
||||
et: "/striim", |
||||
en: "/stream", |
||||
}, |
||||
"/turniirid": { |
||||
et: "/turniirid", |
||||
en: "/tournaments", |
||||
}, |
||||
}, |
||||
}); |
||||
|
||||
// Lightweight wrappers around Next.js' navigation APIs
|
||||
// that will consider the routing configuration
|
||||
export const { Link, redirect, usePathname, useRouter } = |
||||
createNavigation(routing); |
||||
@ -0,0 +1,20 @@ |
||||
import createMiddleware from 'next-intl/middleware'; |
||||
import {routing} from './i18n/routing'; |
||||
|
||||
export default createMiddleware(routing); |
||||
|
||||
export const config = { |
||||
// Match only internationalized pathnames
|
||||
matcher: [ |
||||
// Enable a redirect to a matching locale at the root
|
||||
'/', |
||||
|
||||
// Set a cookie to remember the previous locale for
|
||||
// all requests that have a locale prefix
|
||||
'/(et|en)/:path*', |
||||
|
||||
// Enable redirects that add missing locales
|
||||
// (e.g. `/pathnames` -> `/en/pathnames`)
|
||||
'/((?!_next|_vercel|.*\\..*).*)' |
||||
] |
||||
}; |
||||
@ -0,0 +1,216 @@ |
||||
{ |
||||
"navigation": { |
||||
"home": "Home", |
||||
"schedule": "Schedule", |
||||
"admin": "Admin", |
||||
"houserules": "House rules", |
||||
"expo": "Expo", |
||||
"tickets": "Tickets", |
||||
"rules": "Rules", |
||||
"stream": "Stream", |
||||
"tournaments": "Tournaments" |
||||
}, |
||||
"common": { |
||||
"loading": "Loading...", |
||||
"error": "Error", |
||||
"success": "Success", |
||||
"save": "Save", |
||||
"cancel": "Cancel", |
||||
"delete": "Delete", |
||||
"edit": "Edit", |
||||
"close": "Close", |
||||
"next": "Next", |
||||
"previous": "Previous", |
||||
"search": "Search", |
||||
"filter": "Filter", |
||||
"reset": "Reset", |
||||
"theme": { |
||||
"light": "Light", |
||||
"dark": "Dark", |
||||
"system": "System" |
||||
}, |
||||
"language": { |
||||
"et": "Eesti", |
||||
"en": "English" |
||||
} |
||||
}, |
||||
"home": { |
||||
"title": "TipiLAN 2025", |
||||
"subtitle": "Estonia's largest student-organized LAN event!", |
||||
"welcome": "Welcome to TipiLAN 2025!", |
||||
"description": "Join us at Estonia's largest student-organized LAN event. Games, competitions and much more await you!", |
||||
"sections": { |
||||
"schedule": { |
||||
"description": "TipiLAN is packed with exciting tournaments, mini-competitions and much more." |
||||
}, |
||||
"tournaments": { |
||||
"description": "TipiLAN features massive CS2 and LoL tournaments with a prize pool of €10,000." |
||||
}, |
||||
"expo": { |
||||
"description": "The TipiLAN expo area hosts companies, additional activities and lectures." |
||||
}, |
||||
"reserveSpot": "Reserve your spot today!", |
||||
"poweredBy": "TipiLAN is powered by..." |
||||
} |
||||
}, |
||||
"tickets": { |
||||
"title": "TICKETS AND REGISTRATION", |
||||
"buyNow": "Buy now", |
||||
"soldOut": "Sold out", |
||||
"available": "Available", |
||||
"price": "Price", |
||||
"includes": "Includes", |
||||
"computerParticipant": { |
||||
"title": "Computer Participant", |
||||
"price": "8€", |
||||
"features": [ |
||||
"Personal desk, power and internet connection", |
||||
"Access to demo area", |
||||
"Tournament spectating", |
||||
"Ability to participate in mini-tournaments" |
||||
] |
||||
}, |
||||
"competitor": { |
||||
"title": "Competitor", |
||||
"price": "12-15€", |
||||
"features": [ |
||||
"Ability to participate in the CS2 or LoL tournament", |
||||
"Personal desk, power and internet connection", |
||||
"Access to demo area", |
||||
"Tournament spectating", |
||||
"Ability to participate in mini-tournaments" |
||||
] |
||||
}, |
||||
"visitor": { |
||||
"title": "Visitor", |
||||
"price": "6€", |
||||
"features": [ |
||||
"Access to demo area", |
||||
"Tournament spectating", |
||||
"Ability to participate in mini-tournaments" |
||||
] |
||||
}, |
||||
"buyTicket": "BUY TICKETS" |
||||
}, |
||||
"tournaments": { |
||||
"title": "Tournaments", |
||||
"register": "Register", |
||||
"participants": "Participants", |
||||
"prizePool": "Prize pool", |
||||
"schedule": "Schedule", |
||||
"rules": "Rules", |
||||
"cs2": { |
||||
"title": "CS2 Tournament", |
||||
"timing": "Timing to be announced", |
||||
"description1": "TipiLAN hosts one of Estonia's largest CS2 tournaments with a significant prize pool this fall. Grab your friends and experience the adrenaline rush!", |
||||
"description2": "The prize pool is €5,250, distributed among the TOP3 teams. Each team member receives €600, €300, or €150 based on their placement.", |
||||
"readRules": "READ RULES", |
||||
"buyTicket": "BUY TICKETS" |
||||
}, |
||||
"lol": { |
||||
"title": "LoL Tournament", |
||||
"timing": "Timing to be announced", |
||||
"description1": "TipiLAN hosts one of Estonia's largest LoL tournaments with a significant prize pool this fall. Grab your friends and experience the adrenaline rush!", |
||||
"description2": "The prize pool is €3,500, distributed among the TOP3 teams. Each team member receives €400, €200, or €100 based on their placement.", |
||||
"readRules": "READ RULES", |
||||
"buyTicket": "BUY TICKETS" |
||||
}, |
||||
"mini": { |
||||
"titleSingular": "Mini-tournament", |
||||
"title": "Mini-tournaments", |
||||
"timing": "Timing to be announced", |
||||
"description1": "TipiLAN hosts various fun and competitive mini-tournaments. Mini-tournaments take place in the following games: SimRacing, Tekken, FIFA, Minecraft Bedwars, Buckshot Roulette, LostGamer and many more.", |
||||
"description2": "The total prize pool for all tournaments is €1,250 and typically the mini-tournament winner receives a cash prize.", |
||||
"readRules": "READ RULES", |
||||
"buyTicket": "BUY TICKETS" |
||||
} |
||||
}, |
||||
"schedule": { |
||||
"title": "Schedule", |
||||
"day": "Day", |
||||
"time": "Time", |
||||
"event": "Event", |
||||
"location": "Location", |
||||
"oct24": "October 24th", |
||||
"oct25": "October 25th", |
||||
"events": { |
||||
"doorsOpen": "Doors open", |
||||
"mainTournamentsStart": "Main tournaments begin", |
||||
"miniTournamentsKickoff": "Mini-tournaments kick-off", |
||||
"fightingGamesStart": "Fighting game tournaments start", |
||||
"doorsClose": "Doors close", |
||||
"miniTournamentsStart": "Mini-tournaments begin", |
||||
"granblue": "Granblue tournament", |
||||
"granTurismo": "Gran Turismo tournament" |
||||
}, |
||||
"locations": { |
||||
"registrationSetup": "Registration and setup in auditorium", |
||||
"auditorium": "Auditorium", |
||||
"studentHouse": "Student House (Tudengimaja)", |
||||
"auditoriumAndStudentHouse": "Auditorium and Student House" |
||||
} |
||||
}, |
||||
"stream": { |
||||
"title": "Stream", |
||||
"live": "Live", |
||||
"offline": "Offline", |
||||
"watchNow": "Watch now" |
||||
}, |
||||
"footer": { |
||||
"copyright": "© 2025 TipiLAN. All rights reserved.", |
||||
"contact": "Contact", |
||||
"privacy": "Privacy", |
||||
"terms": "Terms", |
||||
"studentUnion": "IT Faculty Student Council", |
||||
"organization": "MTÜ For Tsükkel", |
||||
"registrationCode": "Registration code" |
||||
}, |
||||
"notFound": { |
||||
"title": "404", |
||||
"message": "We couldn't find this page." |
||||
}, |
||||
"expo": { |
||||
"title": "Expo Area", |
||||
"description": "The TipiLAN expo area hosts companies, additional activities and lectures.", |
||||
"areas": { |
||||
"bar": "Bar Area", |
||||
"boardGames": "Board Games Area", |
||||
"simRacing": "Red Bull Sim Racing", |
||||
"fighting": "Fighting Games Area" |
||||
}, |
||||
"hide": "Hide", |
||||
"show": "Show" |
||||
}, |
||||
"rules": { |
||||
"title": "Rules", |
||||
"houseRules": "House Rules", |
||||
"cs2Rules": "CS2 Rules", |
||||
"lolRules": "LoL Rules" |
||||
}, |
||||
"admin": { |
||||
"title": "Admin", |
||||
"users": "Users", |
||||
"teams": "Teams", |
||||
"success": { |
||||
"title": "Operation was successful!", |
||||
"description": "Database data has been updated." |
||||
}, |
||||
"sync": { |
||||
"title": "Do you want to update the database?", |
||||
"description1": "This will pull current data from Fienta and replace", |
||||
"all": "ALL", |
||||
"description2": "existing data in the database!", |
||||
"warning": "If you're not sure, click \"Cancel\".", |
||||
"update": "Update" |
||||
}, |
||||
"roles": { |
||||
"captain": "Captain", |
||||
"teammate": "Teammate" |
||||
}, |
||||
"table": { |
||||
"name": "Name", |
||||
"members": "Members", |
||||
"noMembers": "No members" |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,215 @@ |
||||
{ |
||||
"navigation": { |
||||
"home": "Avaleht", |
||||
"schedule": "Ajakava", |
||||
"admin": "Haldus", |
||||
"houserules": "Kodukord", |
||||
"expo": "Messiala", |
||||
"tickets": "Piletid", |
||||
"rules": "Reeglid", |
||||
"stream": "Striim", |
||||
"tournaments": "Turniirid" |
||||
}, |
||||
"common": { |
||||
"loading": "Laadimine...", |
||||
"error": "Viga", |
||||
"success": "Õnnestus", |
||||
"save": "Salvesta", |
||||
"cancel": "Tühista", |
||||
"delete": "Kustuta", |
||||
"edit": "Muuda", |
||||
"close": "Sulge", |
||||
"next": "Järgmine", |
||||
"previous": "Eelmine", |
||||
"search": "Otsi", |
||||
"filter": "Filtreeri", |
||||
"reset": "Lähtesta", |
||||
"theme": { |
||||
"light": "Hele", |
||||
"dark": "Tume", |
||||
"system": "Süsteemipõhine" |
||||
}, |
||||
"language": { |
||||
"et": "Eesti", |
||||
"en": "English" |
||||
} |
||||
}, |
||||
"home": { |
||||
"title": "TipiLAN 2025", |
||||
"subtitle": "Eesti suurim tudengite korraldatud LAN!", |
||||
"welcome": "Tere tulemast TipiLAN 2025 sündmusele!", |
||||
"description": "Liitu meiega Eesti suurimal tudengite korraldatud LAN-üritusel. Mängud, võistlused ja palju muud ootavad sind!", |
||||
"sections": { |
||||
"schedule": { |
||||
"description": "TipiLAN on pungil põnevatest turniiridest, mini-võistlustest ja paljust muust." |
||||
}, |
||||
"tournaments": { |
||||
"description": "TipiLANil toimuvad suurejoonelised CS2 ja LoL turniirid, mille auhinnafond on 10 000€." |
||||
}, |
||||
"expo": { |
||||
"description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud." |
||||
}, |
||||
"reserveSpot": "Broneeri oma koht juba täna!", |
||||
"poweredBy": "TipiLANi tõmbab käima..." |
||||
} |
||||
}, |
||||
"tickets": { |
||||
"title": "PILETID JA REGISTREERIMINE", |
||||
"buyNow": "Osta nüüd", |
||||
"soldOut": "Välja müüdud", |
||||
"available": "Saadaval", |
||||
"price": "Hind", |
||||
"includes": "Sisaldab", |
||||
"computerParticipant": { |
||||
"title": "Arvutiga osaleja", |
||||
"price": "8€", |
||||
"features": [ |
||||
"Isiklik laud, voolu- ja internetiühendus", |
||||
"Ligipääs demoalale", |
||||
"Turniiride pealt vaatamine", |
||||
"Võimalus osaleda miniturniiridel" |
||||
] |
||||
}, |
||||
"competitor": { |
||||
"title": "Võistleja", |
||||
"price": "12-15€", |
||||
"features": [ |
||||
"Võimalus osaleda CS2 või LoL turniiril", |
||||
"Isiklik laud, voolu- ja internetiühendus", |
||||
"Ligipääs demoalale", |
||||
"Turniiride pealt vaatamine", |
||||
"Võimalus osaleda miniturniiridel" |
||||
] |
||||
}, |
||||
"visitor": { |
||||
"title": "Külastaja", |
||||
"price": "6€", |
||||
"features": [ |
||||
"Ligipääs demoalale", |
||||
"Turniiride pealt vaatamine", |
||||
"Võimalus osaleda miniturniiridel" |
||||
] |
||||
}, |
||||
"buyTicket": "OSTA PILET" |
||||
}, |
||||
"tournaments": { |
||||
"title": "Turniirid", |
||||
"register": "Registreeru", |
||||
"participants": "Osalejad", |
||||
"prizePool": "Auhinnafond", |
||||
"schedule": "Ajakava", |
||||
"rules": "Reeglid", |
||||
"cs2": { |
||||
"title": "CS2 turniir", |
||||
"timing": "Toimumisaeg veel selgumisel", |
||||
"description1": "TipiLANil toimub Eesti ühe suurima auhinnafondiga CS2 turniire juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest kogemusest!", |
||||
"description2": "Auhinnafond on suuruses 5250€, mis jaotatakse TOP3 meeskonna vahel ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas 600€, 300€ või 150€.", |
||||
"readRules": "LOE REEGLEID", |
||||
"buyTicket": "OSTA PILET" |
||||
}, |
||||
"lol": { |
||||
"title": "LoL turniir", |
||||
"timing": "Toimumisaeg veel selgumisel", |
||||
"description1": "TipiLANil toimub Eesti ühe suurima auhinnafondiga LoL turniire juba sel sügisel. Haara kaasa sõbrad ja saa osa adrenaliinirohkest kogemusest!", |
||||
"description2": "Auhinnafond on suuruses 3500€, mis jaotatakse TOP3 meeskonna vahel ära. Iga tiimiliige saab vastavalt saavutatud kohale auhinnaks kas 400€, 200€ või 100€.", |
||||
"readRules": "LOE REEGLEID", |
||||
"buyTicket": "OSTA PILET" |
||||
}, |
||||
"mini": { |
||||
"title": "Miniturniirid", |
||||
"timing": "Toimumisaeg veel selgumisel", |
||||
"description1": "TipiLANil toimub mitmeid erinevaid lõbusaid ja võistlushimu tekitavaid miniturniire. Miniturniirid toimuvad järgnevates mängudes: SimRacing, Tekken, FIFA, Minecraft Bedwars, Buckshot Roulette, LostGamer ja palju muud.", |
||||
"description2": "Auhinnafond on kõigi turniiride peale 1250€ ja reeglina saab rahalise auhinna miniturniiri võitja.", |
||||
"readRules": "LOE REEGLEID", |
||||
"buyTicket": "OSTA PILET" |
||||
} |
||||
}, |
||||
"schedule": { |
||||
"title": "Ajakava", |
||||
"day": "Päev", |
||||
"time": "Aeg", |
||||
"event": "Sündmus", |
||||
"location": "Asukoht", |
||||
"oct24": "24. oktoober", |
||||
"oct25": "25. oktoober", |
||||
"events": { |
||||
"doorsOpen": "Uksed avatakse", |
||||
"mainTournamentsStart": "Põhiturniirid algavad", |
||||
"miniTournamentsKickoff": "Miniturniiride kick-off", |
||||
"fightingGamesStart": "Fighting games turniiride algus", |
||||
"doorsClose": "Uksed suletakse", |
||||
"miniTournamentsStart": "Miniturniirid algavad", |
||||
"granblue": "Granblue turniir", |
||||
"granTurismo": "Gran Turismo turniir" |
||||
}, |
||||
"locations": { |
||||
"registrationSetup": "Registreerimine ja setup aulas", |
||||
"auditorium": "Aula", |
||||
"studentHouse": "Tudengimaja", |
||||
"auditoriumAndStudentHouse": "Aula ja Tudengimaja" |
||||
} |
||||
}, |
||||
"stream": { |
||||
"title": "Striim", |
||||
"live": "Otse-eetris", |
||||
"offline": "Väljas", |
||||
"watchNow": "Vaata nüüd" |
||||
}, |
||||
"footer": { |
||||
"copyright": "© 2025 TipiLAN. Kõik õigused kaitstud.", |
||||
"contact": "Kontakt", |
||||
"privacy": "Privaatsus", |
||||
"terms": "Tingimused", |
||||
"studentUnion": "IT-teaduskonna üliõpilaskogu", |
||||
"organization": "MTÜ For Tsükkel", |
||||
"registrationCode": "Registrikood" |
||||
}, |
||||
"notFound": { |
||||
"title": "404", |
||||
"message": "Seda lehte me ei leidnud." |
||||
}, |
||||
"expo": { |
||||
"title": "Messiala", |
||||
"description": "TipiLANi messialal paiknevad ettevõtted, lisategevused ja toimuvad loengud.", |
||||
"areas": { |
||||
"bar": "Baariala", |
||||
"boardGames": "Lauamängude ala", |
||||
"simRacing": "Red Bull Sim Racing", |
||||
"fighting": "Võitlusmängu ala" |
||||
}, |
||||
"hide": "Peida", |
||||
"show": "Näita" |
||||
}, |
||||
"rules": { |
||||
"title": "Reeglid", |
||||
"houseRules": "Kodukord", |
||||
"cs2Rules": "CS2 Reeglid", |
||||
"lolRules": "LoL Reeglid" |
||||
}, |
||||
"admin": { |
||||
"title": "Haldus", |
||||
"users": "Kasutajaid", |
||||
"teams": "Meeskondasid", |
||||
"success": { |
||||
"title": "Toiming oli edukas!", |
||||
"description": "Andmebaasi andmed on uuendatud." |
||||
}, |
||||
"sync": { |
||||
"title": "Kas soovite värskendada andmebaasi?", |
||||
"description1": "See tõmbab Fientast praegused andmed ning asendab", |
||||
"all": "KÕIK", |
||||
"description2": "olemasolevad andmed andmebaasis!", |
||||
"warning": "Kui sa ei ole kindel, vajuta \"Tühista\".", |
||||
"update": "Värskenda" |
||||
}, |
||||
"roles": { |
||||
"captain": "Kapten", |
||||
"teammate": "Meeskonnaliige" |
||||
}, |
||||
"table": { |
||||
"name": "Nimi", |
||||
"members": "Liikmed", |
||||
"noMembers": "Liikmeid puuduvad" |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue