Timetable added & updated

This commit is contained in:
2026-08-21 22:40:10 +03:00
parent a981000d3c
commit bb88339939
10 changed files with 754 additions and 91 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 565.86 205.52">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
clip-path: url(#clippath-1);
}
.cls-3 {
clip-path: url(#clippath-3);
}
.cls-4 {
clip-path: url(#clippath-2);
}
.cls-5 {
clip-path: url(#clippath);
}
</style>
<clipPath id="clippath">
<path class="cls-1" d="M150.51,193.78c-14.26,7.5-30.5,11.75-47.73,11.75-52.83,0-96.35-39.88-102.08-91.19,3.65,29.08,24.57,58.31,57.24,75.21,31.88,16.49,66.89,17.07,92.58,4.23h-.01Z"/>
</clipPath>
<clipPath id="clippath-1">
<path class="cls-1" d="M195.64,146.82c-3.52,7.4-7.88,14.29-12.98,20.59-.03.03-.04.07-.07.1-2.41,2.95-4.97,5.77-7.71,8.45-26.85,24.98-73.75,28.64-115.02,6.34C17.53,159.44-5.18,116.67,2.62,79.89c.15-.68.31-1.37.48-2.05.1-.47.23-.92.35-1.38.1-.35.19-.7.29-1.05,2.41-8.78,5.98-17.08,10.5-24.76-21.34,39.01,1.35,92.71,50.81,120.13,49.6,27.51,107.36,18.16,129-20.88.57-1.02,1.1-2.05,1.6-3.08h-.01Z"/>
</clipPath>
<clipPath id="clippath-2">
<path class="cls-1" d="M205.52,102.78c0,3.34-.16,6.66-.48,9.91-1.26,9.89-4.55,19.38-10.05,27.97-24.34,38.06-82.66,44.22-130.28,13.78-1.6-1.02-3.17-2.06-4.7-3.17C20.27,122.76,2.62,77.46,20.44,43.5c2.18-4.17,4.81-7.98,7.84-11.46,3.21-3.37,6.64-6.54,10.28-9.45.36-.29.74-.58,1.1-.87,2.86-2.22,5.83-4.3,8.93-6.22-5.98,4.14-11.06,9.36-15,15.63-20.6,32.73-1.86,81.54,41.84,109.04,18.65,11.73,38.83,17.68,57.45,18.1,22.27-.2,42.48-8.11,55.67-22.94,2.78-3.1,5.22-6.5,7.33-10.19.03-.06.07-.13.1-.19,6.5-11.53,8.81-24.51,7.41-37.67,0-.04,0-.09,0-.15-.33-3.14-.89-6.29-1.63-9.44-.89-4.17-2.04-8.45-3.43-12.78.65,1.6,1.25,3.21,1.8,4.86,2.89,8.56,4.7,17.62,5.23,27.03.12,1.98.17,3.98.17,5.99h0Z"/>
</clipPath>
<clipPath id="clippath-3">
<path class="cls-1" d="M101.37,135.48C33.22,108.38,14.96,26.63,72.2,4.93c3.07-1.16,7.33-2.22,10.53-2.98l2.97-.54C95.44.15,96.02.07,102.26,0c9.29.28,9.65.29,15,1.03,2.5.45,5.83,1,8.3,1.56-62.51-12.1-86.98,40.28-55.77,83.59,8,11.08,17.97,19.6,28.76,25.57,38.08,21.18,86.08,10.86,91.04-29.29,1.85-14.96-3.81-27.03-5.67-30.98C156.63.55,101.94,1.29,93.45,32.62c-8.2,30.28,32.68,63.46,59.94,48.63.23-.13.47-.25.68-.41,4.64-2.76,8.08-7.4,9.52-12.97.1-.36.2-.8.29-1.28,0,0,.09-.42.15-.86.77-5.57-.8-11.35-4.52-16.62l-.09-.13s-.07.04-.1.06c-4.17,2.41-8.34,4.83-12.52,7.23-3.78,2.18-7.55,4.36-11.33,6.54-1.26-2.21-2.54-4.4-3.81-6.61-1.44-2.49-2.86-4.96-4.3-7.44l21.2-12.23,7.88-4.54h0c7.2,3.54,13.3,9.22,17.49,16.32.49.83.96,1.69,1.38,2.54,0,.03.04.06.04.1,3.47,6.92,4.87,14.44,4.3,21.63,0,.04,0,.09,0,.13-.31,4-1.22,7.88-2.72,11.51-2.18,4.96-5.61,9.17-9.94,12.5-11.59,8.93-29.69,11.54-48.31,5.07-42.61-14.79-59.39-62.57-35.89-85.86.07-.09.13-.15.2-.2,4.11-3.81,8.84-6.72,14-8.75,22.26-8.81,52.44-1.45,75.22,20.44,9.16,8.8,16.01,18.87,20.43,29.24.03.07.06.15.09.22,2.09,5.22,3.61,10.25,4.61,15.11.1.48.19.96.28,1.42,9.96,53.38-43.44,83.07-96.26,62.06h0Z"/>
</clipPath>
</defs>
<g>
<path class="cls-1" d="M150.51,193.78c-14.26,7.5-30.5,11.75-47.73,11.75-52.83,0-96.35-39.88-102.08-91.19,3.65,29.08,24.57,58.31,57.24,75.21,31.88,16.49,66.89,17.07,92.58,4.23h-.01Z"/>
<g class="cls-5">
<circle class="cls-1" cx="102.76" cy="102.76" r="102.76"/>
</g>
</g>
<g>
<path class="cls-1" d="M195.64,146.82c-3.52,7.4-7.88,14.29-12.98,20.59-.03.03-.04.07-.07.1-2.41,2.95-4.97,5.77-7.71,8.45-26.85,24.98-73.75,28.64-115.02,6.34C17.53,159.44-5.18,116.67,2.62,79.89c.15-.68.31-1.37.48-2.05.1-.47.23-.92.35-1.38.1-.35.19-.7.29-1.05,2.41-8.78,5.98-17.08,10.5-24.76-21.34,39.01,1.35,92.71,50.81,120.13,49.6,27.51,107.36,18.16,129-20.88.57-1.02,1.1-2.05,1.6-3.08h-.01Z"/>
<g class="cls-2">
<circle class="cls-1" cx="102.76" cy="102.76" r="102.76"/>
</g>
</g>
<g>
<path class="cls-1" d="M205.52,102.78c0,3.34-.16,6.66-.48,9.91-1.26,9.89-4.55,19.38-10.05,27.97-24.34,38.06-82.66,44.22-130.28,13.78-1.6-1.02-3.17-2.06-4.7-3.17C20.27,122.76,2.62,77.46,20.44,43.5c2.18-4.17,4.81-7.98,7.84-11.46,3.21-3.37,6.64-6.54,10.28-9.45.36-.29.74-.58,1.1-.87,2.86-2.22,5.83-4.3,8.93-6.22-5.98,4.14-11.06,9.36-15,15.63-20.6,32.73-1.86,81.54,41.84,109.04,18.65,11.73,38.83,17.68,57.45,18.1,22.27-.2,42.48-8.11,55.67-22.94,2.78-3.1,5.22-6.5,7.33-10.19.03-.06.07-.13.1-.19,6.5-11.53,8.81-24.51,7.41-37.67,0-.04,0-.09,0-.15-.33-3.14-.89-6.29-1.63-9.44-.89-4.17-2.04-8.45-3.43-12.78.65,1.6,1.25,3.21,1.8,4.86,2.89,8.56,4.7,17.62,5.23,27.03.12,1.98.17,3.98.17,5.99h0Z"/>
<g class="cls-4">
<circle class="cls-1" cx="102.83" cy="102.76" r="102.76"/>
</g>
</g>
<g>
<path class="cls-1" d="M101.37,135.48C33.22,108.38,14.96,26.63,72.2,4.93c3.07-1.16,7.33-2.22,10.53-2.98l2.97-.54C95.44.15,96.02.07,102.26,0c9.29.28,9.65.29,15,1.03,2.5.45,5.83,1,8.3,1.56-62.51-12.1-86.98,40.28-55.77,83.59,8,11.08,17.97,19.6,28.76,25.57,38.08,21.18,86.08,10.86,91.04-29.29,1.85-14.96-3.81-27.03-5.67-30.98C156.63.55,101.94,1.29,93.45,32.62c-8.2,30.28,32.68,63.46,59.94,48.63.23-.13.47-.25.68-.41,4.64-2.76,8.08-7.4,9.52-12.97.1-.36.2-.8.29-1.28,0,0,.09-.42.15-.86.77-5.57-.8-11.35-4.52-16.62l-.09-.13s-.07.04-.1.06c-4.17,2.41-8.34,4.83-12.52,7.23-3.78,2.18-7.55,4.36-11.33,6.54-1.26-2.21-2.54-4.4-3.81-6.61-1.44-2.49-2.86-4.96-4.3-7.44l21.2-12.23,7.88-4.54h0c7.2,3.54,13.3,9.22,17.49,16.32.49.83.96,1.69,1.38,2.54,0,.03.04.06.04.1,3.47,6.92,4.87,14.44,4.3,21.63,0,.04,0,.09,0,.13-.31,4-1.22,7.88-2.72,11.51-2.18,4.96-5.61,9.17-9.94,12.5-11.59,8.93-29.69,11.54-48.31,5.07-42.61-14.79-59.39-62.57-35.89-85.86.07-.09.13-.15.2-.2,4.11-3.81,8.84-6.72,14-8.75,22.26-8.81,52.44-1.45,75.22,20.44,9.16,8.8,16.01,18.87,20.43,29.24.03.07.06.15.09.22,2.09,5.22,3.61,10.25,4.61,15.11.1.48.19.96.28,1.42,9.96,53.38-43.44,83.07-96.26,62.06h0Z"/>
<g class="cls-3">
<circle class="cls-1" cx="102.76" cy="102.76" r="102.76"/>
</g>
</g>
<path class="cls-1" d="M298.58,144.4c3.67,0,5.15,2.71,5.15,5.4s-1.48,5.4-5.15,5.4h-4.6v6.51h-2.29v-17.31h6.89ZM298.43,153.07c2.16,0,3.02-1.61,3.02-3.27s-.83-3.29-2.89-3.29h-4.57v6.56h4.45,0Z"/>
<path class="cls-1" d="M324.64,161.71l-4.55-6.53h-2.24v6.53h-2.29v-17.31h6.51c3.77,0,5.23,2.71,5.23,5.4,0,2.51-1.43,5.18-4.52,5.4l4.6,6.51h-2.74ZM317.86,146.51v6.58h3.62c2.54,0,3.54-1.33,3.54-3.29s-1.13-3.29-2.89-3.29h-4.27Z"/>
<path class="cls-1" d="M338.44,153.09c0-4.93,3.82-9,8.74-9s8.8,4.07,8.8,9-3.85,8.92-8.8,8.92-8.74-4.02-8.74-8.92ZM353.69,153.09c0-3.72-2.81-6.89-6.51-6.89s-6.46,3.17-6.46,6.89,2.81,6.81,6.46,6.81,6.51-3.12,6.51-6.81Z"/>
<path class="cls-1" d="M374.88,144.4c4.93,0,7.82,3.77,7.82,8.7s-2.89,8.62-7.82,8.62h-6.71v-17.31h6.71ZM374.88,159.6c3.64,0,5.53-2.81,5.53-6.51s-1.88-6.58-5.53-6.58h-4.42v13.09h4.42Z"/>
<path class="cls-1" d="M394.76,155.81v-11.41h2.29v11.41c0,2.74,1.86,4.02,4.02,4.02s4.02-1.28,4.02-4.02v-11.41h2.29v11.41c0,3.95-2.89,6.21-6.31,6.21s-6.31-2.26-6.31-6.21Z"/>
<path class="cls-1" d="M419.33,153.09c0-4.9,3.9-9,8.8-9,2.66,0,4.98,1.13,6.51,2.94l-1.66,1.41c-1.16-1.36-2.91-2.24-4.85-2.24-3.64,0-6.51,3.17-6.51,6.89s2.86,6.81,6.51,6.81c1.93,0,3.69-.88,4.85-2.24l1.66,1.41c-1.53,1.81-3.84,2.94-6.51,2.94-4.9,0-8.8-4.02-8.8-8.92Z"/>
<path class="cls-1" d="M457.33,144.4v2.11h-5.28v15.2h-2.29v-15.2h-5.28v-2.11h12.85Z"/>
<path class="cls-1" d="M468.79,161.71v-17.31h2.29v17.31h-2.29Z"/>
<path class="cls-1" d="M483.21,153.09c0-4.93,3.82-9,8.75-9s8.79,4.07,8.79,9-3.84,8.92-8.79,8.92-8.75-4.02-8.75-8.92ZM498.47,153.09c0-3.72-2.81-6.89-6.51-6.89s-6.46,3.17-6.46,6.89,2.81,6.81,6.46,6.81,6.51-3.12,6.51-6.81Z"/>
<path class="cls-1" d="M523.15,144.4h2.29v17.31h-2.21l-7.99-13.19v13.19h-2.29v-17.31h2.26l7.94,13.14v-13.14Z"/>
<path class="cls-1" d="M537.65,156.81h2.26c.08,1.53,1.53,3.09,3.85,3.09s3.49-1.46,3.49-2.99c0-1.68-1.53-2.44-2.99-2.81l-2.24-.55c-3.67-.88-4.25-3.04-4.25-4.45,0-2.99,2.69-5,5.7-5s5.48,1.93,5.48,5.03h-2.26c0-1.73-1.43-2.92-3.29-2.92-1.73,0-3.34,1.16-3.34,2.87,0,.6.2,1.81,2.51,2.41l2.26.6c2.94.78,4.7,2.29,4.7,4.75,0,2.69-2.19,5.18-5.78,5.18s-6.08-2.51-6.11-5.2h.01Z"/>
<polygon class="cls-1" points="500.56 109.36 499.61 112.09 500.56 109.36 500.56 109.36"/>
<path class="cls-1" d="M309.44,104.85h10.53c.11,4.89-4.94,8.33-10.48,8.33-7.09,0-12.36-6.13-12.36-13.17s5.32-13.16,12.25-13.16c3.33,0,6.34,1.4,8.54,3.6l4.73-4.14c-3.22-3.39-7.95-5.53-13.27-5.53-10.59,0-18.86,8.71-18.86,19.24s8.17,19.08,19.08,19.08c10.32,0,17.57-6.23,17.57-19.72h-17.73v5.48h0Z"/>
<polygon class="cls-1" points="355.23 81.42 348.68 81.42 348.68 118.44 369.63 118.44 369.63 112.59 355.23 112.59 355.23 81.42"/>
<path class="cls-1" d="M405.22,80.77c-10.59,0-18.81,8.71-18.81,19.18s8.22,19.13,18.81,19.13,18.81-8.65,18.81-19.13-8.28-19.18-18.81-19.18ZM405.16,112.96c-7.04,0-12.15-5.91-12.15-13s5.11-13.06,12.15-13.06,12.31,5.97,12.31,13.06-5.21,13-12.31,13Z"/>
<path class="cls-1" d="M466.27,98.67c3.76-1.34,4.84-4.84,4.84-7.74,0-5.64-4.08-9.51-10.53-9.51h-14.4v37.02h15.53c7.69,0,11.39-5.32,11.39-10.53,0-4.08-2.31-8.33-6.82-9.24h-.01ZM460.68,112.59h-7.95v-25.31h7.58c2.85,0,4.24,1.99,4.24,4.57s-1.51,4.52-4.24,4.52h-.78l-1.92,5.53h3.23c3.92,0,5.64,2.74,5.64,5.37,0,2.79-1.99,5.32-5.8,5.32Z"/>
<polygon class="cls-1" points="504.32 81.42 490.4 118.44 497.39 118.44 499.61 112.09 499.61 112.09 499.61 112.09 500.56 109.36 500.56 109.36 502.56 103.67 502.55 103.67 507.87 88.62 513.13 103.67 509.34 103.67 507.36 109.36 515.12 109.36 518.35 118.44 525.28 118.44 511.41 81.42 504.32 81.42"/>
<polygon class="cls-1" points="551.46 112.59 551.46 81.42 544.9 81.42 544.9 118.44 565.86 118.44 565.86 112.59 551.46 112.59"/>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -1,27 +1,198 @@
import { vipnagorgialla } from "@/components/Vipnagorgialla";
import { getTranslations, setRequestLocale } from "next-intl/server";
"use client";
export default async function Timetable({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
setRequestLocale(locale);
const t = await getTranslations({ locale });
import { useState } from "react";
import { useSearchParams } from "next/navigation";
import { vipnagorgialla } from "@/components/Vipnagorgialla";
import { scheduleData, type ScheduleItem } from "@/data/timetable";
import { useTranslations, useLocale } from "next-intl";
const tabs = Object.keys(scheduleData);
// Map of filter shorthand to location key suffixes
const FILTER_MAP: Record<string, string[]> = {
aula: ['auditorium'],
auditorium: ['auditorium'],
tudengimaja: ['studentHouse'],
studenthouse: ['studentHouse'],
fuajee: ['lobbyAndLanArea'],
foyer: ['lobbyAndLanArea'],
lan: ['lobbyAndLanArea'],
lanarea: ['lobbyAndLanArea'],
lobby: ['lobbyAndLanArea'],
};
function matchesFilter(item: ScheduleItem, filter: string): boolean {
const normalizedFilter = filter.toLowerCase();
const locationKeys = Array.isArray(item.locationKey) ? item.locationKey : [item.locationKey];
// Get the matching location suffixes from the filter map, or use the filter directly
const filterSuffixes = FILTER_MAP[normalizedFilter] || [normalizedFilter];
// Check if any of the item's location keys contain any of the filter suffixes
return locationKeys.some(key =>
filterSuffixes.some(suffix =>
key.toLowerCase().includes(suffix.toLowerCase())
)
);
}
function formatLocationKeys(keys: string[], t: (key: string) => string, locale: string): string {
const translated = keys.map(k => t(k));
if (translated.length === 1) return translated[0];
const isEstonian = locale === 'et';
const and = isEstonian ? ' ja ' : ' and ';
if (translated.length === 2) {
return translated.join(and);
}
if (isEstonian) {
return translated.slice(0, -1).join(', ') + and + translated[translated.length - 1];
}
return translated.slice(0, -1).join(', ') + ', and ' + translated[translated.length - 1];
}
export default function Timetable() {
const searchParams = useSearchParams();
const filter = searchParams.get('filter') || '';
const [activeTab, setActiveTab] = useState(tabs[0]);
const schedule = scheduleData[activeTab];
const t = useTranslations();
const locale = useLocale();
// Filter schedule items based on the filter parameter
const filteredSchedule = filter
? schedule.filter(item => matchesFilter(item, filter))
: schedule;
return (
<div className="bg-[#0E0F19] min-h-screen flex flex-col items-center justify-center">
<h1
className={`${vipnagorgialla.className} font-bold italic text-[clamp(1.75rem,5vw,3rem)] text-[#EEE5E5] uppercase mb-4 text-center`}
>
{t("schedule.title")}
</h1>
<p
className={`${vipnagorgialla.className} font-bold italic text-[clamp(2rem,8vw,4.5rem)] text-[#EEE5E5] uppercase text-center`}
>
{t("schedule.comingSoon")}
</p>
<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 uppercase text-[#2A2C3F] dark:text-[#EEE5E5] mt-8 md:mt-16 mb-8`}
>
{t("schedule.title")}
</h1>
{/* Tab menu */}
<div className="flex gap-4 mb-8 flex-wrap">
{tabs.map((tab) => (
<button
key={tab}
onClick={() => setActiveTab(tab)}
className={`${vipnagorgialla.className} group font-bold cursor-pointer italic leading-none text-lg uppercase px-4 py-2 border-4 border-[#00A3E0] transition ${
activeTab === tab
? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
}`}
>
{t(`schedule.${tab}`)}
</button>
))}
</div>
{/* Filter buttons */}
<div className="mb-2">
<h2 className={`${vipnagorgialla.className} text-2xl md:text-3xl italic font-bold uppercase text-[#2A2C3F] dark:text-[#EEE5E5]`}>
{t("schedule.location")}
</h2>
</div>
<div className="flex gap-4 mb-8 flex-wrap">
<button
onClick={() => {
const url = new URL(window.location.href);
url.searchParams.delete('filter');
window.history.pushState({}, '', url.toString());
}}
className={`${vipnagorgialla.className} font-bold italic leading-none text-lg uppercase px-4 py-2 border-4 border-[#00A3E0] transition cursor-pointer ${
!filter
? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
}`}
>
{t("common.all")}
</button>
<button
onClick={() => {
const url = new URL(window.location.href);
url.searchParams.set('filter', 'aula');
window.history.pushState({}, '', url.toString());
}}
className={`${vipnagorgialla.className} font-bold italic leading-none text-lg uppercase px-4 py-2 border-4 border-[#00A3E0] transition cursor-pointer ${
filter === 'aula'
? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
}`}
>
{t("schedule.locations.auditorium")}
</button>
<button
onClick={() => {
const url = new URL(window.location.href);
url.searchParams.set('filter', 'tudengimaja');
window.history.pushState({}, '', url.toString());
}}
className={`${vipnagorgialla.className} font-bold italic leading-none text-lg uppercase px-4 py-2 border-4 border-[#00A3E0] transition cursor-pointer ${
filter === 'tudengimaja'
? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
}`}
>
{t("schedule.locations.studentHouse")}
</button>
<button
onClick={() => {
const url = new URL(window.location.href);
url.searchParams.set('filter', 'lobby');
window.history.pushState({}, '', url.toString());
}}
className={`${vipnagorgialla.className} font-bold italic leading-none text-lg uppercase px-4 py-2 border-4 border-[#00A3E0] transition cursor-pointer ${
filter === 'lobby'
? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
}`}
>
{t("schedule.locations.lobbyAndLanArea")}
</button>
</div>
{/* Schedule entries */}
<div className="space-y-6">
{filteredSchedule.map((item, idx) => (
<div
key={idx}
className="border-l-4 border-[#007CAB] pl-8 flex flex-col sm:flex-row flex-wrap gap-2 sm:gap-5 items-stretch"
>
<div
className={`${vipnagorgialla.className} w-[260px] md:w-[360px] text-[#00A3E0] text-3xl md:text-[2.5rem] font-bold italic flex items-start justify-start sm:pt-3 whitespace-nowrap`}
>
{item.time}
</div>
<div className="flex-1 flex flex-col justify-start pt-3 min-w-0 sm:min-h-24">
<div
className={`${vipnagorgialla.className} text-2xl md:text-3xl italic font-bold text-[#2A2C3F] dark:text-[#EEE5E5] text-balance`}
>
{t(item.titleKey)}
</div>
{item.description && (
<div className="text-xl md:text-2xl text-[#938BA1] dark:text-[#938BA1] text-balance">
{item.description}
</div>
)}
<div className="text-xl md:text-2xl text-[#938BA1] dark:text-[#938BA1] text-balance">
{Array.isArray(item.locationKey)
? formatLocationKeys(item.locationKey, t, locale)
: t(item.locationKey)
}
</div>
</div>
</div>
))}
</div>
<p className="text-xl pt-8 max-w-4xl italic">{t("schedule.transportInfo")}</p>
</div>
</div>
);
}

View File

@@ -32,7 +32,7 @@ export default async function Page({
return (
<div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20">
<div className="max-w-480 mx-auto px-4 sm:px-6 md:px-12 lg:px-64 py-10 md:py-20">
<div className="grid grid-cols-1 lg:grid-cols-[1fr_250px] lg:gap-30">
<div className="tournament-page-scope grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16">
{/* Main content */}
<div>
{/* Page title */}

View File

@@ -41,7 +41,7 @@ const Header = ({ navItems }: HeaderProps) => {
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
// Header navigation should include all options except homepage and hidden items
const hiddenNavHrefs: NavItem["href"][] = ["/messiala", "/ajakava"];
const hiddenNavHrefs: NavItem["href"][] = ["/messiala"];
const mainNavItems = navItems.filter(
(item) => item.href !== "/" && !hiddenNavHrefs.includes(item.href),
);

View File

@@ -60,7 +60,7 @@ const sponsors: Sponsor[] = [
},
{
href: "https://globalproductions.ee/",
src: "/sponsors/Global-productions.png",
src: "/sponsors/Global-productions.svg",
alt: "Global Productions",
width: 200,
height: 200,

View File

@@ -288,14 +288,14 @@ export default function SwitchableTicketCard({
{/* Chevron buttons on left/right sides */}
<button
onClick={() => setIsA(false)}
className={`${isA ? "flex" : "hidden"} absolute right-0 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center bg-[#0E0F19]/50 hover:bg-[#007CAB] text-[#EEE5E5] transition-all duration-300 z-20`}
className={`${isA ? "flex" : "hidden"} absolute right-0 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center cursor-pointer bg-[#0E0F19]/50 hover:bg-[#007CAB] text-[#EEE5E5] transition-all duration-300 z-20`}
aria-label={optionB.title}
>
<span className="material-symbols-outlined">chevron_right</span>
</button>
<button
onClick={() => setIsA(true)}
className={`${!isA ? "flex" : "hidden"} absolute left-0 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center bg-[#0E0F19]/50 hover:bg-[#007CAB] text-[#EEE5E5] transition-all duration-300 z-20`}
className={`${!isA ? "flex" : "hidden"} absolute left-0 top-1/2 -translate-y-1/2 w-10 h-10 items-center justify-center cursor-pointer bg-[#0E0F19]/50 hover:bg-[#007CAB] text-[#EEE5E5] transition-all duration-300 z-20`}
aria-label={optionA.title}
>
<span className="material-symbols-outlined">chevron_left</span>

View File

@@ -1,112 +1,392 @@
export type ScheduleItem = {
time?: string; // Aeg on ajutine praegu kuna pole 100% kindlalt paigas
titleKey: string;
locationKey: string;
locationKey: string | string[];
description?: string;
};
export const scheduleData: Record<string, ScheduleItem[]> = {
oct24: [
sep11: [
{
titleKey: "schedule.events.doorsOpen",
locationKey: "schedule.locations.registrationSetup",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse",
"schedule.locations.lobbyAndLanArea"
],
time: "17:00",
},
{
titleKey: "schedule.events.gamersSetup",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse"
],
time: "17:00-19:00",
},
{
titleKey: "schedule.events.exploring",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse"
],
time: "17:00-18:00",
},
{
titleKey: "schedule.events.gameDevShowcasing",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "17:00-00:00",
},
{
titleKey: "schedule.events.miniTournaments",
locationKey: "schedule.locations.studentHouse",
time: "18:00",
},
{
titleKey: "schedule.events.smashBrosUltimate",
locationKey: "schedule.locations.studentHouse",
time: "18:30",
titleKey: "schedule.events.lanAreaTournaments",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "18:00-00:00",
},
{
titleKey: "schedule.events.cs2LolTournaments",
titleKey: "schedule.events.minigamesAndTournaments",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "18:00-00:00",
},
{
titleKey: "schedule.events.blueCarpet",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse"
],
time: "19:00",
},
{
titleKey: "schedule.events.day1Begins",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse"
],
time: "19:30",
},
{
titleKey: "schedule.events.cs2SwissR1",
locationKey: "schedule.locations.auditorium",
time: "20:00",
time: "20:00-21:00",
},
{
titleKey: "schedule.events.lolGame1",
locationKey: "schedule.locations.studentHouse",
time: "20:00-21:00",
},
{
titleKey: "schedule.events.cs2SwissR2",
locationKey: "schedule.locations.auditorium",
time: "21:00-22:00",
},
{
titleKey: "schedule.events.lolGame2",
locationKey: "schedule.locations.studentHouse",
time: "21:00-22:00",
},
{
titleKey: "schedule.events.cs2SwissR3",
locationKey: "schedule.locations.auditorium",
time: "22:00-23:00",
},
{
titleKey: "schedule.events.lolGame3",
locationKey: "schedule.locations.studentHouse",
time: "22:00-23:00",
},
{
titleKey: "schedule.events.cs2SwissR4",
locationKey: "schedule.locations.auditorium",
time: "23:00-00:00",
},
{
titleKey: "schedule.events.lolGame4",
locationKey: "schedule.locations.studentHouse",
time: "23:00-00:00",
},
{
titleKey: "schedule.events.cs2SwissR5",
locationKey: "schedule.locations.auditorium",
time: "00:00-01:00",
},
{
titleKey: "schedule.events.lolGame5",
locationKey: "schedule.locations.studentHouse",
time: "00:00-01:00",
},
{
titleKey: "schedule.events.doorsClose",
locationKey: "schedule.locations.auditoriumAndStudentHouse",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse",
"schedule.locations.lobbyAndLanArea"
],
time: "*01:00",
},
],
oct25: [
sep12: [
{
titleKey: "schedule.events.doorsOpenSimple",
locationKey: "schedule.locations.auditorium",
time: "09:30",
locationKey: [
"schedule.locations.auditorium",
"schedule.locations.studentHouse",
"schedule.locations.lobbyAndLanArea"
],
time: "09:00",
},
{
titleKey: "schedule.events.cs2Continue",
titleKey: "schedule.events.gamersSetup",
locationKey: "schedule.locations.auditorium",
time: "11:00",
time: "09:00-10:30",
},
{
titleKey: "schedule.events.lolContinue",
titleKey: "schedule.events.gamersSetup",
locationKey: "schedule.locations.studentHouse",
time: "09:00-11:30",
},
{
titleKey: "schedule.events.mcWbR1",
locationKey: "schedule.locations.auditorium",
time: "12:00",
time: "10:30-13:00",
},
{
titleKey: "schedule.events.scWbR1",
locationKey: "schedule.locations.studentHouse",
time: "10:30-11:30",
},
{
titleKey: "schedule.events.scLbR1",
locationKey: "schedule.locations.studentHouse",
time: "11:30-12:30",
},
{
titleKey: "schedule.events.mcTournamentQuarters",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "11:30-14:30",
},
{
titleKey: "schedule.events.expoOpens",
locationKey: "schedule.locations.entranceHall",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "12:00",
},
{
titleKey: "schedule.events.2xkoTournament",
titleKey: "schedule.events.gamedevExpo",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "12:00-19:00",
},
{
titleKey: "schedule.events.miniTournaments",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "13:00-19:00",
},
{
titleKey: "schedule.events.mcLbR1",
locationKey: "schedule.locations.auditorium",
time: "13:00-14:00",
},
{
titleKey: "schedule.events.scWbR2",
locationKey: "schedule.locations.studentHouse",
time: "13:30",
time: "12:30-13:30",
},
{
titleKey: "schedule.events.lolFinale",
locationKey: "schedule.locations.auditorium",
time: "19:30",
},
{
titleKey: "schedule.events.cs2lbsemifinals",
locationKey: "schedule.locations.auditorium",
time: "19:30",
},
{
titleKey: "schedule.events.cs2lbfinals",
locationKey: "schedule.locations.auditorium",
time: "21:30",
},
{
titleKey: "schedule.events.granTurismoFinale",
titleKey: "schedule.events.scLbR2",
locationKey: "schedule.locations.studentHouse",
time: "20:00",
time: "13:30-14:30",
},
{
titleKey: "schedule.events.mcWbR2",
locationKey: "schedule.locations.auditorium",
time: "14:00-16:00",
},
{
titleKey: "schedule.events.scWbR3",
locationKey: "schedule.locations.studentHouse",
time: "14:30-15:30",
},
{
titleKey: "schedule.events.break",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "14:30-15:00",
},
{
titleKey: "schedule.events.semiFinals",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "15:00-18:00",
},
{
titleKey: "schedule.events.scLbR3",
locationKey: "schedule.locations.studentHouse",
time: "15:45-16:30",
},
{
titleKey: "schedule.events.mcLbR2",
locationKey: "schedule.locations.auditorium",
time: "16:30-17:30",
},
{
titleKey: "schedule.events.scLbR4",
locationKey: "schedule.locations.studentHouse",
time: "16:30-17:30",
},
{
titleKey: "schedule.events.break",
locationKey: "schedule.locations.auditorium",
time: "17:30-19:30",
},
{
titleKey: "schedule.events.break",
locationKey: "schedule.locations.studentHouse",
time: "18:00-19:00",
},
{
titleKey: "schedule.events.avatarLegendsFinal",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "19:00-19:30",
},
{
titleKey: "schedule.events.gamedevAwardCeremony",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "19:00-20:00",
},
{
titleKey: "schedule.events.finalsAndThirdPlace",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "19:00-00:00",
},
{
titleKey: "schedule.events.mcWbR3",
locationKey: "schedule.locations.auditorium",
time: "19:30-22:00",
},
{
titleKey: "schedule.events.scSemiFinal",
locationKey: "schedule.locations.studentHouse",
time: "19:30-20:30",
},
{
titleKey: "schedule.events.tekken8Final",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "19:30-20:00",
},
{
titleKey: "schedule.events.streetFighter6Final",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "20:00-20:30",
},
{
titleKey: "schedule.events.gamedevExpo",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "20:00-00:00",
},
{
titleKey: "schedule.events.twoXkoFinal",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "20:30-21:00",
},
{
titleKey: "schedule.events.scLbR5",
locationKey: "schedule.locations.studentHouse",
time: "20:30-21:30",
},
{
titleKey: "schedule.events.ssbuFinal",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "21:00-21:30",
},
{
titleKey: "schedule.events.scTournamentFinalEnd",
locationKey: "schedule.locations.studentHouse",
time: "21:30-23:30",
},
{
titleKey: "schedule.events.invincibleVsFinal",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "21:30-22:00",
},
{
titleKey: "schedule.events.mcLbR3",
locationKey: "schedule.locations.auditorium",
time: "22:00-23:00",
},
{
titleKey: "schedule.events.miniTournamentsAwardCeremony",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "22:00-22:30",
},
{
titleKey: "schedule.events.mcLbR4",
locationKey: "schedule.locations.auditorium",
time: "23:00-00:00",
},
{
titleKey: "schedule.events.awardCeremony",
locationKey: "schedule.locations.lobbyAndLanArea",
time: "00:00-00:30",
},
{
titleKey: "schedule.events.doorsClose",
locationKey: "schedule.locations.auditoriumAndStudentHouse",
time: "*01:00",
locationKey: "schedule.locations.auditorium",
time: "*01:30",
},
],
oct26: [
sep13: [
{
titleKey: "schedule.events.cs2semifinals",
locationKey: "schedule.locations.auditorium",
time: "11:00",
titleKey: "schedule.events.noEventsScheduled",
locationKey: [
"schedule.locations.studentHouse",
"schedule.locations.lobbyAndLanArea"
],
time: "-",
},
{
titleKey: "schedule.events.Cs2finals",
titleKey: "schedule.events.doorsOpenSimple",
locationKey: "schedule.locations.auditorium",
time: "15:30",
time: "09:00",
},
{
titleKey: "schedule.events.AwardsCeremony",
titleKey: "schedule.events.gamersSetup",
locationKey: "schedule.locations.auditorium",
time: "18:00",
time: "09:30-10:30",
},
{
titleKey: "schedule.events.doorsClose",
titleKey: "schedule.events.cs2WbR4",
locationKey: "schedule.locations.auditorium",
time: "10:30-13:00",
},
{
titleKey: "schedule.events.cs2LbR5",
locationKey: "schedule.locations.auditorium",
time: "13:00-14:00",
},
{
titleKey: "schedule.events.cs2LbR6",
locationKey: "schedule.locations.auditorium",
time: "14:00-16:00",
},
{
titleKey: "schedule.events.cs2GrandFinal",
locationKey: "schedule.locations.auditorium",
time: "16:00-18:00",
},
{
titleKey: "schedule.events.awardCeremony",
locationKey: "schedule.locations.auditorium",
time: "18:30",
},
{
titleKey: "schedule.events.closingCeremony",
locationKey: "schedule.locations.auditorium",
time: "19:00",
},
{
titleKey: "schedule.events.doorsClose",
locationKey: "schedule.locations.auditorium",
time: "19:30",
},
],
};

View File

@@ -24,6 +24,7 @@
"search": "Search",
"filter": "Filter",
"reset": "Reset",
"all": "ALL",
"theme": {
"light": "Light",
"dark": "Dark",
@@ -483,7 +484,7 @@
},
"info": {
"title": "GENERAL INFO",
"description": "TipiLAN 2026 LoL tournament takes place September 11-13 at TalTech, Tallinn, Estonia. This is a BYOC (bring your own computer) LAN tournament. On-site, each participant is provided with: desk, chair, wired internet connection, power connection (2 outlets)."
"description": "TipiLAN 2026 LoL tournament takes place September 11-12 at TalTech, Tallinn, Estonia. This is a BYOC (bring your own computer) LAN tournament. On-site, each participant is provided with: desk, chair, wired internet connection, power connection (2 outlets)."
},
"prizes": {
"title": "PRIZE POOL",
@@ -514,7 +515,7 @@
{
"title": "General Information",
"rules": [
"The League of Legends (hereinafter LoL) tournament takes place as a two-day event on September 11-13, 2026 at Tallinn University of Technology (TalTech) premises, Ehitajate tee 5, Tallinn.",
"The League of Legends (hereinafter LoL) tournament takes place as a two-day event on September 11-12, 2026 at Tallinn University of Technology (TalTech) premises, Ehitajate tee 5, Tallinn.",
{
"main": "The tournament prize pool is 3000€, distributed as follows:",
"sub": [
@@ -727,9 +728,9 @@
"time": "Time",
"event": "Event",
"location": "Location",
"oct24": "October 24th",
"oct25": "October 25th",
"oct26": "October 26th",
"sep11": "September 11th",
"sep12": "September 12th",
"sep13": "September 13th",
"events": {
"doorsOpen": "Doors open, expo area available",
"doorsOpenSimple": "Doors open",
@@ -755,19 +756,84 @@
"cs2semifinals": "CS2 upper bracket semifinals",
"Cs2finals": "CS2 finals",
"AwardsCeremony": "Awards ceremony",
"awardCeremony": "Award ceremony",
"granTurismoFinale": "Gran Turismo finale",
"lolTournamentSemifinals": "LoL tournament semifinals",
"cs2Finale": "CS2 finale",
"cs2FinalMatch": "CS2 final match",
"cs2TournamentFinale": "CS2 tournament finale"
"cs2TournamentFinale": "CS2 tournament finale",
"gamersSetup": "Gamers Setup",
"staffSetup": "Staff Setup",
"exploring": "Exploring",
"gameDevShowcasing": "GameDev Showcasing",
"lanAreaTournaments": "LAN Area Tournaments",
"minigamesAndTournaments": "Minigames and Tournaments",
"blueCarpet": "Blue Carpet",
"day1Begins": "Day 1 Begins",
"cs2SwissR1": "CS2 Swiss Round 1",
"cs2SwissR2": "CS2 Swiss Round 2",
"cs2SwissR3": "CS2 Swiss Round 3",
"cs2SwissR4": "CS2 Swiss Round 4",
"cs2SwissR5": "CS2 Swiss Round 5",
"lolGame1": "LoL Game 1",
"lolGame2": "LoL Game 2",
"lolGame3": "LoL Game 3",
"lolGame4": "LoL Game 4",
"lolGame5": "LoL Game 5",
"gamedevExpo": "Gamedev Expo",
"gamedevAwardCeremony": "Gamedev Award Ceremony",
"mcTournamentQuarters": "Main Championship Tournament (Quarter finals)",
"mcWbR1": "Main Championship WB Round 1",
"mcWbR2": "Main Championship WB Round 2",
"mcWbR3": "Main Championship WB Round 3",
"mcLbR1": "Main Championship LB Round 1",
"mcLbR2": "Main Championship LB Round 2",
"mcLbR3": "Main Championship LB Round 3",
"mcLbR4": "Main Championship LB Round 4",
"scWbR1": "Second Chance WB Round 1",
"scWbR2": "Second Chance WB Round 2",
"scWbR3": "Second Chance WB Round 3",
"scLbR1": "Second Chance LB Round 1",
"scLbR2": "Second Chance LB Round 2",
"scLbR3": "Second Chance LB Round 3",
"scLbR4": "Second Chance LB Round 4",
"scLbR5": "Second Chance LB Round 5",
"scSemiFinal": "Second Chance Semi Final",
"scTournamentFinal": "Second Chance Tournament Final",
"scTournamentFinalEnd": "Second Chance Tournament Final (END OF SECOND CHANCE TOURNAMENT)",
"semiFinals": "Semi Finals",
"break": "Break",
"avatarLegendsFinal": "Avatar Legends final",
"tekken8Final": "Tekken 8 final",
"streetFighter6Final": "Street Fighter 6 final",
"twoXkoFinal": "2XKO final",
"ssbuFinal": "SSBU final",
"invincibleVsFinal": "Invincible VS final",
"finalsAndThirdPlace": "Finals + 3rd place",
"miniTournamentsAwardCeremony": "Mini Tournaments Award Ceremony",
"justFunTime": "Just fun time?",
"estimatedEndOfDay2": "Estimated End of Day 2",
"estimatedEndOfFinals": "Estimated End of Finals",
"timeToLeave": "TIME TO LEAVE",
"cs2WbR4": "CS2 Winner Bracket Round 4 (Upper Finals)",
"cs2LbR5": "CS2 Loser Bracket Round 5",
"cs2LbR6": "CS2 Loser Bracket Round 6 (Lower Finals)",
"cs2GrandFinal": "CS2 Grand Final",
"closingCeremony": "Closing of TipiLAN 2026",
"noEventsScheduled": "No events scheduled for these areas"
},
"locations": {
"registrationSetup": "Registration and setup in auditorium",
"auditorium": "Auditorium",
"studentHouse": "Student House (Tudengimaja)",
"auditoriumAndStudentHouse": "Auditorium and Student House",
"entranceHall": "Lobby"
}
"auditoriumAndStudentHouseAndFuajee": "Auditorium, Student House, and Fuajee/LAN Area",
"entranceHall": "Lobby",
"fuajeeLanAla": "Fuajee/LAN Area",
"foyerAndLanArea": "Fuajee/LAN Area",
"lobbyAndLanArea": "Lobby/LAN area"
},
"transportInfo": "Come to TipiLAN by public transport if possible! Buses 10, 11, 23, 24, 27, 33, 36, 37, 45, 67 and trolleybus 83 will take you to TalTech. If you come by car, don't come alone - bring your friends!"
},
"stream": {
"title": "Stream",

View File

@@ -24,6 +24,7 @@
"search": "Otsi",
"filter": "Filtreeri",
"reset": "Lähtesta",
"all": "KÕIK",
"theme": {
"light": "Hele",
"dark": "Tume",
@@ -484,7 +485,7 @@
},
"info": {
"title": "ÜLDINE INFO",
"description": "TipiLAN 2026 LoL turniir toimub 11.-13. septembril TalTechis, Tallinnas, Eestis. Tegemist on BYOC (bring your own computer) LAN turniiriga. Kohapeal pakutakse igale osalejale: laud, tool, võrgukaabliga internetiühendus, vooluühendus (2 pesa)."
"description": "TipiLAN 2026 LoL turniir toimub 11.-12. septembril TalTechis, Tallinnas, Eestis. Tegemist on BYOC (bring your own computer) LAN turniiriga. Kohapeal pakutakse igale osalejale: laud, tool, võrgukaabliga internetiühendus, vooluühendus (2 pesa)."
},
"prizes": {
"title": "AUHINNAFOND",
@@ -515,7 +516,7 @@
{
"title": "Üldist",
"rules": [
"League of Legends (edaspidi LoL) turniir toimub kahepäevase üritusena 11.-13. september, 2026 Tallinna Tehnikaülikooli (TalTech) ruumides, Ehitajate tee 5, Tallinn.",
"League of Legends (edaspidi LoL) turniir toimub kahepäevase üritusena 11.-12. september, 2026 Tallinna Tehnikaülikooli (TalTech) ruumides, Ehitajate tee 5, Tallinn.",
{
"main": "Turniiri auhinnafondiks on 3000€, mis jaguneb järgnevalt:",
"sub": [
@@ -728,9 +729,9 @@
"time": "Aeg",
"event": "Sündmus",
"location": "Asukoht",
"oct24": "24. oktoober",
"oct25": "25. oktoober",
"oct26": "26. oktoober",
"sep11": "11. september",
"sep12": "12. september",
"sep13": "13. september",
"events": {
"doorsOpen": "Uksed avatakse, messiala avatud",
"doorsOpenSimple": "Uksed avatakse",
@@ -756,19 +757,84 @@
"cs2semifinals": "CS2 ülemliiga poolfinaalid",
"Cs2finals": "CS2 finaalid",
"AwardsCeremony": "Autasustamine",
"awardCeremony": "Autasustamine",
"granTurismoFinale": "Gran Turismo finaal",
"lolTournamentSemifinals": "LoL turniiri poolfinaalid",
"cs2Finale": "CS2 finaal",
"cs2FinalMatch": "CS2 finaalimäng",
"cs2TournamentFinale": "CS2 turniiri finaal"
"cs2TournamentFinale": "CS2 turniiri finaal",
"gamersSetup": "Mängijate seadistamine",
"staffSetup": "Personal seadistamine",
"exploring": "Avastamine",
"gameDevShowcasing": "Mänguarenduse tutvustamine",
"lanAreaTournaments": "LAN-ala turniirid",
"minigamesAndTournaments": "Minimängud ja turniirid",
"blueCarpet": "Sinine vaip",
"day1Begins": "Päev 1 algab",
"cs2SwissR1": "CS2 Šveitsi ring 1",
"cs2SwissR2": "CS2 Šveitsi ring 2",
"cs2SwissR3": "CS2 Šveitsi ring 3",
"cs2SwissR4": "CS2 Šveitsi ring 4",
"cs2SwissR5": "CS2 Šveitsi ring 5",
"lolGame1": "LoL Mäng 1",
"lolGame2": "LoL Mäng 2",
"lolGame3": "LoL Mäng 3",
"lolGame4": "LoL Mäng 4",
"lolGame5": "LoL Mäng 5",
"gamedevExpo": "Mänguarenduse Expo",
"gamedevAwardCeremony": "Mänguarenduse autasustamine",
"mcTournamentQuarters": "Peaturniir (veerandfinaalid)",
"mcWbR1": "Peaturniir WB Ring 1",
"mcWbR2": "Peaturniir WB Ring 2",
"mcWbR3": "Peaturniir WB Ring 3",
"mcLbR1": "Peaturniir LB Ring 1",
"mcLbR2": "Peaturniir LB Ring 2",
"mcLbR3": "Peaturniir LB Ring 3",
"mcLbR4": "Peaturniir LB Ring 4",
"scWbR1": "Teine võimalus WB Ring 1",
"scWbR2": "Teine võimalus WB Ring 2",
"scWbR3": "Teine võimalus WB Ring 3",
"scLbR1": "Teine võimalus LB Ring 1",
"scLbR2": "Teine võimalus LB Ring 2",
"scLbR3": "Teine võimalus LB Ring 3",
"scLbR4": "Teine võimalus LB Ring 4",
"scLbR5": "Teine võimalus LB Ring 5",
"scSemiFinal": "Teine võimalus poolfinaal",
"scTournamentFinal": "Teine võimalus turniiri finaal",
"scTournamentFinalEnd": "Teine võimalus turniiri finaal (TEISE VÕIMALUSE TURNIIRI LÕPP)",
"semiFinals": "Poolfinaalid",
"break": "Paus",
"avatarLegendsFinal": "Avatar Legends finaal",
"tekken8Final": "Tekken 8 finaal",
"streetFighter6Final": "Street Fighter 6 finaal",
"twoXkoFinal": "2XKO finaal",
"ssbuFinal": "SSBU finaal",
"invincibleVsFinal": "Invincible VS finaal",
"finalsAndThirdPlace": "Finaalid + 3. koht",
"miniTournamentsAwardCeremony": "Miniturniiride autasustamine",
"justFunTime": "Lihtsalt lõbus aeg?",
"estimatedEndOfDay2": "Päeva 2 eeldatav lõpp",
"estimatedEndOfFinals": "Finaalide eeldatav lõpp",
"timeToLeave": "AEG LÄHEDA",
"cs2WbR4": "CS2 võitjate veergu 4. ring (ülempoolfinaalid)",
"cs2LbR5": "CS2 kaotajate veergu 5. ring",
"cs2LbR6": "CS2 kaotajate veergu 6. ring (alampoolfinaalid)",
"cs2GrandFinal": "CS2 suurfinaal",
"closingCeremony": "TipiLAN 2026 sulgemine",
"noEventsScheduled": "Nendel aladel pole üritusi"
},
"locations": {
"registrationSetup": "Registreerimine ja setup aulas",
"auditorium": "Aula",
"studentHouse": "Tudengimaja",
"auditoriumAndStudentHouse": "Aula ja Tudengimaja",
"entranceHall": "Fuajee"
}
"auditoriumAndStudentHouseAndFuajee": "Aula, Tudengimaja ja Fuajee/LAN-ala",
"entranceHall": "Fuajee",
"fuajeeLanAla": "Fuajee/LAN-ala",
"foyerAndLanArea": "Fuajee/LAN-ala",
"lobbyAndLanArea": "Fuajee/LAN-ala"
},
"transportInfo": "Tule võimaluse korral TipiLANile ühistranspordiga! TalTechi toovad sind bussid 10, 11, 23, 24, 27, 33, 36, 37, 45, 67 ja troll 83. Kui tuled autoga, siis ära tule üksi, võta sõbrad kaasa!"
},
"stream": {
"title": "Striim",