Bunch of minor fixes

This commit is contained in:
2026-05-09 17:56:33 +03:00
parent c08a665503
commit 3c025639aa
12 changed files with 183 additions and 118 deletions

View File

@@ -30,7 +30,7 @@ export default async function Page({
return ( return (
<div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20"> <div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20">
<div className="max-w-480 mx-auto px-6 md:px-12 py-8 md:py-16"> <div className="max-w-480 mx-auto px-8 md:px-16 py-10 md:py-20">
<div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16"> <div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16">
{/* Main content */} {/* Main content */}
<div> <div>
@@ -41,50 +41,56 @@ export default async function Page({
{t("rules.houseRules")} {t("rules.houseRules")}
</h1> </h1>
<ReactMarkdown <div className="rules-markdown">
components={ <ReactMarkdown
{ components={
h1: (props) => { {
const id = h1: (props) => {
sections[headingCount]?.id || `section-${headingCount}`; const id =
headingCount++; sections[headingCount]?.id || `section-${headingCount}`;
return ( headingCount++;
<h1 return (
id={id} <h1
className={`${vipnagorgialla.className} font-bold italic text-2xl md:text-3xl text-white uppercase mb-4 mt-12 first:mt-0 scroll-mt-24 md:scroll-mt-28`} id={id}
className={`${vipnagorgialla.className} font-bold italic text-2xl md:text-3xl text-white uppercase mb-4 mt-12 first:mt-0 scroll-mt-24 md:scroll-mt-28`}
>
{props.children}
</h1>
);
},
h2: (props) => (
<h2
className={`${vipnagorgialla.className} font-bold italic text-xl text-white uppercase mb-2 mt-6`}
> >
{props.children} {props.children}
</h1> </h2>
); ),
}, ol: (props) => (
h2: (props) => ( <ol className="text-white mb-4 leading-[19px]">
<h2 {props.children}
className={`${vipnagorgialla.className} font-bold italic text-xl text-white uppercase mb-2 mt-6`} </ol>
> ),
{props.children} ul: (props) => (
</h2> <ul className="list-disc list-inside text-white mb-4 leading-[19px]">
), {props.children}
ol: (props) => ( </ul>
<ol className="list-decimal list-inside text-white mb-4"> ),
{props.children} p: (props) => (
</ol> <p className="text-white mb-4 leading-[19px]">
), {props.children}
ul: (props) => ( </p>
<ul className="list-disc list-inside text-white mb-4"> ),
{props.children} li: (props) => (
</ul> <li className="text-white mb-2 leading-[19px]">
), {props.children}
p: (props) => ( </li>
<p className="text-white mb-4">{props.children}</p> ),
), } as Components
li: (props) => ( }
<li className="text-white mb-2">{props.children}</li> >
), {content}
} as Components </ReactMarkdown>
} </div>
>
{content}
</ReactMarkdown>
</div> </div>
{/* Sidebar navigation */} {/* Sidebar navigation */}

View File

@@ -79,7 +79,7 @@ function TicketCard({
</ul> </ul>
<Link href={buttonHref} target="_blank"> <Link href={buttonHref} target="_blank">
<button <button
className={`px-4 py-2 bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] cursor-pointer ${vipnagorgialla.className} font-bold italic uppercase transition`} className={`px-4 py-2 border-4 border-transparent bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] cursor-pointer ${vipnagorgialla.className} font-bold italic leading-none uppercase transition`}
> >
{buttonText} {buttonText}
</button> </button>

View File

@@ -30,7 +30,7 @@ export default async function CS2Tournament({
return ( return (
<div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20"> <div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20">
<div className="max-w-480 mx-auto px-6 md:px-12 py-8 md:py-16"> <div className="max-w-480 mx-auto px-8 md:px-16 py-10 md:py-20">
<div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16"> <div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16">
{/* Main content */} {/* Main content */}
<div> <div>
@@ -46,14 +46,14 @@ export default async function CS2Tournament({
<Link <Link
href="https://fienta.com/et/tipilan" href="https://fienta.com/et/tipilan"
target="_blank" target="_blank"
className={`${vipnagorgialla.className} font-bold italic px-4 py-3 bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] uppercase transition`} className={`${vipnagorgialla.className} font-bold italic leading-none text-lg px-4 py-3 border-4 border-transparent bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] uppercase transition`}
> >
{t("cs2page.buyTicket")} {t("cs2page.buyTicket")}
</Link> </Link>
<Link <Link
href="https://git.edunaut.ee/slunk/TipiLAN_reeglistik_ruleset/src/branch/main/CS2%20tournament" href="https://git.edunaut.ee/slunk/TipiLAN_reeglistik_ruleset/src/branch/main/CS2%20tournament"
target="_blank" target="_blank"
className={`${vipnagorgialla.className} font-bold italic text-lg uppercase px-4 py-2 border-2 border-[#00A3E0] bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black transition`} className={`${vipnagorgialla.className} font-bold italic leading-none text-lg uppercase px-4 py-3 border-4 border-[#00A3E0] bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black transition`}
> >
{t("cs2page.viewGithub")} {t("cs2page.viewGithub")}
</Link> </Link>
@@ -66,7 +66,7 @@ export default async function CS2Tournament({
> >
{t("cs2page.intro.title")} {t("cs2page.intro.title")}
</h2> </h2>
<p className="text-white mb-6"> <p className="text-white mb-6 leading-[19px]">
{t("cs2page.intro.description")} {t("cs2page.intro.description")}
</p> </p>
@@ -75,8 +75,8 @@ export default async function CS2Tournament({
> >
{t("cs2page.intro.previousWinners")} {t("cs2page.intro.previousWinners")}
</h3> </h3>
<p className="text-white font-bold">2025</p> <p className="text-white font-bold leading-[19px]">2025</p>
<ol className="text-white list-decimal list-inside mb-4"> <ol className="text-white list-decimal list-inside mb-4 leading-[19px]">
<li>RAID (Eesti)</li> <li>RAID (Eesti)</li>
<li>hypewrld (Läti)</li> <li>hypewrld (Läti)</li>
<li>CSDIILIT (Soome/Eesti)</li> <li>CSDIILIT (Soome/Eesti)</li>
@@ -90,7 +90,9 @@ export default async function CS2Tournament({
> >
{t("cs2page.info.title")} {t("cs2page.info.title")}
</h2> </h2>
<p className="text-white">{t("cs2page.info.description")}</p> <p className="text-white leading-[19px]">
{t("cs2page.info.description")}
</p>
</section> </section>
{/* AUHINNAFOND */} {/* AUHINNAFOND */}
@@ -106,7 +108,7 @@ export default async function CS2Tournament({
> >
{t("cs2page.prizes.mainTitle")} {t("cs2page.prizes.mainTitle")}
</h3> </h3>
<ul className="text-white mb-2"> <ul className="text-white mb-2 leading-[19px]">
<li> <li>
1. koht - 3000, 600 inimese kohta, 50% ehk 1/2 1. koht - 3000, 600 inimese kohta, 50% ehk 1/2
auhinnafondist. auhinnafondist.
@@ -120,7 +122,7 @@ export default async function CS2Tournament({
auhinnafondist. auhinnafondist.
</li> </li>
</ul> </ul>
<p className="text-white/80 text-sm mb-6"> <p className="text-white/80 text-sm mb-6 leading-[19px]">
{t("cs2page.prizes.mainNote")} {t("cs2page.prizes.mainNote")}
</p> </p>
@@ -129,7 +131,7 @@ export default async function CS2Tournament({
> >
{t("cs2page.prizes.secondTitle")} {t("cs2page.prizes.secondTitle")}
</h3> </h3>
<ul className="text-white mb-2"> <ul className="text-white mb-2 leading-[19px]">
<li> <li>
1. koht - 500, 100 inimese kohta, 66.6...(6)% ehk 2/3 1. koht - 500, 100 inimese kohta, 66.6...(6)% ehk 2/3
auhinnafondist. auhinnafondist.
@@ -139,7 +141,7 @@ export default async function CS2Tournament({
auhinnafondist. auhinnafondist.
</li> </li>
</ul> </ul>
<p className="text-white/80 text-sm"> <p className="text-white/80 text-sm leading-[19px]">
{t("cs2page.prizes.secondNote")} {t("cs2page.prizes.secondNote")}
</p> </p>
</section> </section>
@@ -151,11 +153,15 @@ export default async function CS2Tournament({
> >
{t("cs2page.format.title")} {t("cs2page.format.title")}
</h2> </h2>
<p className="text-white mb-4"> <p className="text-white mb-4 leading-[19px]">
{t("cs2page.format.description")} {t("cs2page.format.description")}
</p> </p>
<p className="text-white">{t("cs2page.format.day1")}</p> <p className="text-white leading-[19px]">
<p className="text-white">{t("cs2page.format.day23")}</p> {t("cs2page.format.day1")}
</p>
<p className="text-white leading-[19px]">
{t("cs2page.format.day23")}
</p>
</section> </section>
{/* VRS INFO */} {/* VRS INFO */}
@@ -165,8 +171,12 @@ export default async function CS2Tournament({
> >
{t("cs2page.vrs.title")} {t("cs2page.vrs.title")}
</h2> </h2>
<p className="text-white mb-4">{t("cs2page.vrs.description1")}</p> <p className="text-white mb-4 leading-[19px]">
<p className="text-white">{t("cs2page.vrs.description2")}</p> {t("cs2page.vrs.description1")}
</p>
<p className="text-white leading-[19px]">
{t("cs2page.vrs.description2")}
</p>
</section> </section>
{/* FAQ - commented out until content is ready {/* FAQ - commented out until content is ready
@@ -194,19 +204,23 @@ export default async function CS2Tournament({
> >
{t("cs2page.rules.title")} {t("cs2page.rules.title")}
</h2> </h2>
<p className="text-white mb-6"> <p className="text-white mb-6 leading-[19px]">
{t("cs2page.rules.description")} {t("cs2page.rules.description")}
</p> </p>
<RulesContent sections={t.raw("cs2page.rules.sections")} /> <RulesContent sections={t.raw("cs2page.rules.sections")} />
<div className="mt-8"> <div className="mt-8">
<p className="text-white mb-2">{t("cs2page.rules.contact")}</p> <p className="text-white mb-2 leading-[19px]">
{t("cs2page.rules.contact")}
</p>
<p className="text-[#00A3E0] font-bold"> <p className="text-[#00A3E0] font-bold">
{t("cs2page.rules.contactName")} {t("cs2page.rules.contactName")}
</p> </p>
<p className="text-white">{t("cs2page.rules.contactRole")}</p> <p className="text-white leading-[19px]">
<p className="text-white"> {t("cs2page.rules.contactRole")}
</p>
<p className="text-white leading-[19px]">
Discord:{" "} Discord:{" "}
<a <a
href="https://discord.com/users/292372329747710013" href="https://discord.com/users/292372329747710013"

View File

@@ -29,7 +29,7 @@ export default async function LoLTournament({
return ( return (
<div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20"> <div className="bg-[#0E0F19] min-h-screen pt-16 md:pt-20">
<div className="max-w-480 mx-auto px-6 md:px-12 py-8 md:py-16"> <div className="max-w-480 mx-auto px-8 md:px-16 py-10 md:py-20">
<div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16"> <div className="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-8 lg:gap-16">
{/* Main content */} {/* Main content */}
<div> <div>
@@ -45,7 +45,7 @@ export default async function LoLTournament({
<Link <Link
href="https://fienta.com/et/tipilan" href="https://fienta.com/et/tipilan"
target="_blank" target="_blank"
className={`${vipnagorgialla.className} font-bold italic px-4 py-2 bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] uppercase transition`} className={`${vipnagorgialla.className} font-bold italic leading-none text-lg px-4 py-3 border-4 border-transparent bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] uppercase transition`}
> >
{t("lolpage.buyTicket")} {t("lolpage.buyTicket")}
</Link> </Link>
@@ -58,7 +58,7 @@ export default async function LoLTournament({
> >
{t("lolpage.intro.title")} {t("lolpage.intro.title")}
</h2> </h2>
<p className="text-white mb-6"> <p className="text-white mb-6 leading-[19px]">
{t("lolpage.intro.description")} {t("lolpage.intro.description")}
</p> </p>
@@ -67,8 +67,8 @@ export default async function LoLTournament({
> >
{t("lolpage.intro.previousWinners")} {t("lolpage.intro.previousWinners")}
</h3> </h3>
<p className="text-white font-bold">2025</p> <p className="text-white font-bold leading-[19px]">2025</p>
<ol className="text-white list-decimal list-inside mb-4"> <ol className="text-white list-decimal list-inside mb-4 leading-[19px]">
<li>Ükssilm (Eesti)</li> <li>Ükssilm (Eesti)</li>
<li>Eesti Rästikud (Eesti)</li> <li>Eesti Rästikud (Eesti)</li>
<li>LOMiks (Läti)</li> <li>LOMiks (Läti)</li>
@@ -82,7 +82,9 @@ export default async function LoLTournament({
> >
{t("lolpage.info.title")} {t("lolpage.info.title")}
</h2> </h2>
<p className="text-white">{t("lolpage.info.description")}</p> <p className="text-white leading-[19px]">
{t("lolpage.info.description")}
</p>
</section> </section>
{/* AUHINNAFOND */} {/* AUHINNAFOND */}
@@ -98,12 +100,12 @@ export default async function LoLTournament({
> >
{t("lolpage.prizes.mainTitle")} {t("lolpage.prizes.mainTitle")}
</h3> </h3>
<ul className="text-white mb-2"> <ul className="text-white mb-2 leading-[19px]">
<li>{t("lolpage.prizes.place1")}</li> <li>{t("lolpage.prizes.place1")}</li>
<li>{t("lolpage.prizes.place2")}</li> <li>{t("lolpage.prizes.place2")}</li>
<li>{t("lolpage.prizes.place3")}</li> <li>{t("lolpage.prizes.place3")}</li>
</ul> </ul>
<p className="text-white/80 text-sm"> <p className="text-white/80 text-sm leading-[19px]">
{t("lolpage.prizes.note")} {t("lolpage.prizes.note")}
</p> </p>
</section> </section>
@@ -115,11 +117,15 @@ export default async function LoLTournament({
> >
{t("lolpage.format.title")} {t("lolpage.format.title")}
</h2> </h2>
<p className="text-white mb-4"> <p className="text-white mb-4 leading-[19px]">
{t("lolpage.format.description")} {t("lolpage.format.description")}
</p> </p>
<p className="text-white">{t("lolpage.format.day1")}</p> <p className="text-white leading-[19px]">
<p className="text-white">{t("lolpage.format.day2")}</p> {t("lolpage.format.day1")}
</p>
<p className="text-white leading-[19px]">
{t("lolpage.format.day2")}
</p>
</section> </section>
{/* FAQ - commented out until content is ready {/* FAQ - commented out until content is ready
@@ -147,19 +153,23 @@ export default async function LoLTournament({
> >
{t("lolpage.rules.title")} {t("lolpage.rules.title")}
</h2> </h2>
<p className="text-white mb-6"> <p className="text-white mb-6 leading-[19px]">
{t("lolpage.rules.description")} {t("lolpage.rules.description")}
</p> </p>
<RulesContent sections={t.raw("lolpage.rules.sections")} /> <RulesContent sections={t.raw("lolpage.rules.sections")} />
<div className="mt-8"> <div className="mt-8">
<p className="text-white mb-2">{t("lolpage.rules.contact")}</p> <p className="text-white mb-2 leading-[19px]">
{t("lolpage.rules.contact")}
</p>
<p className="text-[#00A3E0] font-bold"> <p className="text-[#00A3E0] font-bold">
{t("lolpage.rules.contactName")} {t("lolpage.rules.contactName")}
</p> </p>
<p className="text-white">{t("lolpage.rules.contactRole")}</p> <p className="text-white leading-[19px]">
<p className="text-white"> {t("lolpage.rules.contactRole")}
</p>
<p className="text-white leading-[19px]">
Discord:{" "} Discord:{" "}
<a <a
href="https://discord.com/users/125585160761638912" href="https://discord.com/users/125585160761638912"

View File

@@ -132,6 +132,35 @@ body {
} }
} }
.rules-markdown ol {
counter-reset: list-item;
list-style: none;
margin-left: 0;
padding-left: 0;
}
.rules-markdown ol > li {
counter-increment: list-item;
position: relative;
padding-left: 2.5rem;
font-variant-numeric: tabular-nums;
}
.rules-markdown ol > li::before {
content: counters(list-item, ".") ".";
position: absolute;
left: 0;
width: 2rem;
text-align: right;
color: #ffffff;
}
.rules-markdown ol ol {
counter-reset: list-item;
margin-top: 0.5rem;
margin-left: 1rem;
}
.material-symbols-outlined { .material-symbols-outlined {
font-variation-settings: font-variation-settings:
"FILL" 1, "FILL" 1,

View File

@@ -40,8 +40,11 @@ const Header = ({ navItems }: HeaderProps) => {
const pathname = usePathname(); const pathname = usePathname();
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
// Header navigation should include all options except homepage // Header navigation should include all options except homepage and hidden items
const mainNavItems = navItems.filter((item) => item.href !== "/"); const hiddenNavHrefs: NavItem["href"][] = ["/messiala", "/ajakava"];
const mainNavItems = navItems.filter(
(item) => item.href !== "/" && !hiddenNavHrefs.includes(item.href),
);
const dropdownNavItems = mainNavItems; const dropdownNavItems = mainNavItems;
const navIconByHref: Partial<Record<NavItem["href"], string>> = { const navIconByHref: Partial<Record<NavItem["href"], string>> = {
@@ -86,16 +89,16 @@ const Header = ({ navItems }: HeaderProps) => {
<Image <Image
src="/tipilan-icon-white.svg" src="/tipilan-icon-white.svg"
alt="TipiLAN" alt="TipiLAN"
width={49} width={40}
height={40} height={40}
className="h-10 w-auto" className="h-auto w-10"
/> />
</Link> </Link>
{/* Right side - Navigation + controls */} {/* Right side - Navigation + controls */}
<div className="flex items-center gap-12"> <div className="flex items-center gap-12">
{/* Desktop Navigation */} {/* Desktop Navigation */}
<nav className="hidden xl:flex items-center gap-12"> <nav className="hidden xl:flex items-center gap-8">
{mainNavItems.map((item) => { {mainNavItems.map((item) => {
const isActive = pathname === item.href; const isActive = pathname === item.href;
@@ -106,7 +109,7 @@ const Header = ({ navItems }: HeaderProps) => {
aria-current={isActive ? "page" : undefined} aria-current={isActive ? "page" : undefined}
aria-disabled={isActive ? true : undefined} aria-disabled={isActive ? true : undefined}
tabIndex={isActive ? -1 : undefined} tabIndex={isActive ? -1 : undefined}
className={`${vipnagorgialla.className} group font-bold italic text-lg uppercase px-4 py-1.5 border-2 border-[#00A3E0] transition ${ className={`${vipnagorgialla.className} group font-bold italic leading-none text-lg uppercase px-4 py-1.5 border-4 border-[#00A3E0] transition ${
isActive isActive
? "bg-[#00A3E0] text-black cursor-default pointer-events-none" ? "bg-[#00A3E0] text-black cursor-default pointer-events-none"
: "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black" : "bg-[#1F5673] text-[#EEE5E5] hover:bg-[#00A3E0] hover:text-black"
@@ -155,7 +158,7 @@ const Header = ({ navItems }: HeaderProps) => {
> >
{isActive ? ( {isActive ? (
<span <span
className={`${vipnagorgialla.className} block w-full cursor-default bg-[#00A3E0] px-5 py-2.5 text-xl font-bold italic uppercase text-black ${ className={`${vipnagorgialla.className} block w-full cursor-default bg-[#00A3E0] px-5 py-2.5 text-xl font-bold italic leading-none uppercase text-black ${
hasBottomBorder ? "border-b-3 border-[#1F5673]" : "" hasBottomBorder ? "border-b-3 border-[#1F5673]" : ""
}`} }`}
> >
@@ -181,7 +184,7 @@ const Header = ({ navItems }: HeaderProps) => {
) : ( ) : (
<Link <Link
href={item.href} href={item.href}
className={`${vipnagorgialla.className} group block w-full bg-[#0E0F19] px-5 py-2.5 text-xl font-bold italic uppercase text-[#EEE5E5] transition hover:bg-[#00A3E0] hover:text-black ${ className={`${vipnagorgialla.className} group block w-full bg-[#0E0F19] px-5 py-2.5 text-xl font-bold italic leading-none uppercase text-[#EEE5E5] transition hover:bg-[#00A3E0] hover:text-black ${
hasBottomBorder ? "border-b-3 border-[#1F5673]" : "" hasBottomBorder ? "border-b-3 border-[#1F5673]" : ""
}`} }`}
> >

View File

@@ -35,7 +35,7 @@ export default function HeroSection() {
</div> </div>
<Link <Link
href="/piletid" href="/piletid"
className={`self-center md:self-start px-6 py-3 bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] ${vipnagorgialla.className} font-bold italic text-[clamp(1rem,0.8rem+0.8vw,1.5rem)] uppercase transition`} className={`self-center md:self-start px-6 py-3 border-4 border-transparent bg-[#00A3E0] hover:bg-[#E5E5EE] text-[#0A121F] ${vipnagorgialla.className} font-bold italic leading-none text-[clamp(1rem,0.8rem+0.8vw,1.5rem)] uppercase transition`}
> >
{t("hero.buyTicket")} {t("hero.buyTicket")}
</Link> </Link>

View File

@@ -25,7 +25,7 @@ function RuleItem({
}) { }) {
if (typeof rule === "string") { if (typeof rule === "string") {
return ( return (
<li className="text-white mb-2"> <li className="text-white mb-2 leading-[19px]">
<span className="text-white mr-2">{index}.</span> <span className="text-white mr-2">{index}.</span>
{rule} {rule}
</li> </li>
@@ -33,7 +33,7 @@ function RuleItem({
} }
return ( return (
<li className="text-white mb-3"> <li className="text-white mb-3 leading-[19px]">
<span className="text-white mr-2">{index}.</span> <span className="text-white mr-2">{index}.</span>
{rule.main} {rule.main}
{rule.sub && rule.sub.length > 0 && ( {rule.sub && rule.sub.length > 0 && (
@@ -41,7 +41,7 @@ function RuleItem({
{rule.sub.map((subRule, subIndex) => { {rule.sub.map((subRule, subIndex) => {
if (typeof subRule === "string") { if (typeof subRule === "string") {
return ( return (
<li key={subIndex} className="text-white mb-1"> <li key={subIndex} className="text-white mb-1 leading-[19px]">
<span className="text-white mr-2"> <span className="text-white mr-2">
{index}.{subIndex + 1}. {index}.{subIndex + 1}.
</span> </span>
@@ -50,7 +50,7 @@ function RuleItem({
); );
} }
return ( return (
<li key={subIndex} className="text-white mb-2"> <li key={subIndex} className="text-white mb-2 leading-[19px]">
<span className="text-white mr-2"> <span className="text-white mr-2">
{index}.{subIndex + 1}. {index}.{subIndex + 1}.
</span> </span>
@@ -58,7 +58,10 @@ function RuleItem({
{subRule.sub && subRule.sub.length > 0 && ( {subRule.sub && subRule.sub.length > 0 && (
<ol className="ml-6 mt-1"> <ol className="ml-6 mt-1">
{subRule.sub.map((subSubRule, subSubIndex) => ( {subRule.sub.map((subSubRule, subSubIndex) => (
<li key={subSubIndex} className="text-white/80 mb-1"> <li
key={subSubIndex}
className="text-white/80 mb-1 leading-[19px]"
>
<span className="text-white/80 mr-2"> <span className="text-white/80 mr-2">
{index}.{subIndex + 1}.{subSubIndex + 1}. {index}.{subIndex + 1}.{subSubIndex + 1}.
</span> </span>

View File

@@ -94,7 +94,7 @@ export default function TeaserCarousel() {
return ( return (
<div className="border-b-3 border-[#1F5673]"> <div className="border-b-3 border-[#1F5673]">
{/* Slides (fade transition + hero lift effect) */} {/* Slides (fade transition + hero lift effect) */}
<div className="relative h-135 sm:h-140 md:h-160 lg:h-175 xl:h-155 2xl:h-165 overflow-hidden"> <div className="relative h-135 sm:h-140 md:h-160 lg:h-[720px] xl:h-[780px] 2xl:h-[820px] overflow-hidden">
{slides.map((slide, i) => { {slides.map((slide, i) => {
const title = t(`${slide.key}.title`); const title = t(`${slide.key}.title`);
const description = t(`${slide.key}.description`); const description = t(`${slide.key}.description`);
@@ -172,7 +172,7 @@ export default function TeaserCarousel() {
})} })}
{/* Floating heading (mobile) */} {/* Floating heading (mobile) */}
<div className="absolute top-5 inset-x-0 px-8 z-20 md:hidden pointer-events-none"> <div className="absolute top-8 inset-x-0 px-8 z-20 md:hidden pointer-events-none">
<h2 <h2
className={`${vipnagorgialla.className} font-bold italic text-[clamp(2rem,1.5rem+4.6vw,3rem)] leading-[0.95] tracking-normal uppercase text-[#EEE5E5] whitespace-normal wrap-break-word text-left max-w-[12ch]`} className={`${vipnagorgialla.className} font-bold italic text-[clamp(2rem,1.5rem+4.6vw,3rem)] leading-[0.95] tracking-normal uppercase text-[#EEE5E5] whitespace-normal wrap-break-word text-left max-w-[12ch]`}
> >
@@ -181,7 +181,7 @@ export default function TeaserCarousel() {
</div> </div>
{/* Floating heading (desktop/tablet) */} {/* Floating heading (desktop/tablet) */}
<div className="absolute top-8 inset-x-0 px-4 sm:px-6 md:px-12 z-20 hidden md:flex pointer-events-none"> <div className="absolute top-12 inset-x-0 px-4 sm:px-6 md:px-12 z-20 hidden md:flex pointer-events-none">
<div <div
className="transition-[flex-grow] duration-700 ease-out" className="transition-[flex-grow] duration-700 ease-out"
style={{ flexGrow: headingOnRight ? 1 : 0 }} style={{ flexGrow: headingOnRight ? 1 : 0 }}

View File

@@ -12,18 +12,18 @@ Event participation house rules apply to everyone, both visitors and competitors
1. Participants are obligated to behave politely and with dignity and respect other event participants. 1. Participants are obligated to behave politely and with dignity and respect other event participants.
2. TipiLAN does not tolerate: 2. TipiLAN does not tolerate:
2.1. Hate speech based on national, racial, gender, sexual or religious affiliation, disabilities, appearance or age; harassment, threatening, offensive or aggressive behavior, incitement or support thereof 1. Hate speech based on national, racial, gender, sexual or religious affiliation, disabilities, appearance or age; harassment, threatening, offensive or aggressive behavior, incitement or support thereof
2.2. This applies both on the event premises (IRL) and in online environments related to the event. 2. This applies both on the event premises (IRL) and in online environments related to the event.
3. Participants are obligated to treat the event building, inventory and furnishings with care. It is forbidden to break, stain or move items that do not belong to the participant. 3. Participants are obligated to treat the event building, inventory and furnishings with care. It is forbidden to break, stain or move items that do not belong to the participant.
3.1. If a participant has organizer-provided accommodation, then in the accommodation area the participant is obligated to be quiet and allow companions to rest. 1. If a participant has organizer-provided accommodation, then in the accommodation area the participant is obligated to be quiet and allow companions to rest.
3.2. Persons who are not provided accommodation there may not be invited to the accommodation area. 2. Persons who are not provided accommodation there may not be invited to the accommodation area.
4. TipiLAN is not responsible for participants' personal property. 4. TipiLAN is not responsible for participants' personal property.
4.1. The organizer-provided accommodation area is lockable and unauthorized persons are not allowed there, but regardless of this, it is worth keeping an eye on your valuables. 1. The organizer-provided accommodation area is lockable and unauthorized persons are not allowed there, but regardless of this, it is worth keeping an eye on your valuables.
4.2. If there is suspicion that theft has occurred, this must be immediately reported to the organizer. 2. If there is suspicion that theft has occurred, this must be immediately reported to the organizer.
4.3. When finding lost items, please give them to the organizer or take them to *lost & found* (Merchandise table). 3. When finding lost items, please give them to the organizer or take them to *lost & found* (Merchandise table).
5. Smoking and using vapes is prohibited on the event premises. There are designated smoking areas outside for this purpose. 5. Smoking and using vapes is prohibited on the event premises. There are designated smoking areas outside for this purpose.
6. Illegal substances or drugs, sharp objects, firearms, explosives or incendiary materials and other items that may harm participants or others may not be brought to the event. 6. Illegal substances or drugs, sharp objects, firearms, explosives or incendiary materials and other items that may harm participants or others may not be brought to the event.
7. Underage participants are prohibited from consuming alcohol or using nicotine-containing products. 7. Underage participants are prohibited from consuming alcohol or using nicotine-containing products.
7.1. When purchasing alcohol from the bar, participants are obligated to show identification upon request by bar staff. 1. When purchasing alcohol from the bar, participants are obligated to show identification upon request by bar staff.
8. Participants are obligated to behave responsibly regarding alcohol. 8. Participants are obligated to behave responsibly regarding alcohol.
9. Any form of gambling for money or other benefits is prohibited. 9. Any form of gambling for money or other benefits is prohibited.

View File

@@ -10,21 +10,21 @@
# Ürituse kodukord # Ürituse kodukord
1. Osaleja kohustub käituma viisakalt ning väärikalt ja austama teisi üritusel osalejaid. 1. Osaleja kohustub käituma viisakalt ning väärikalt ja austama teisi üritusel osalejaid.
2. TipiLAN ei tolereeri: 2. TipiLAN ei tolereeri:
2.1. Vihakõnet rahvusliku, rassilise, soolise, seksuaalse või religioosse kuuluvuse, puude, välimuse või vanuse kohta; ahistamist, ähvardavat, solvavat või agressiivset käitumist, sellele õhutamist või selle pooldamist 1. Vihakõnet rahvusliku, rassilise, soolise, seksuaalse või religioosse kuuluvuse, puude, välimuse või vanuse kohta; ahistamist, ähvardavat, solvavat või agressiivset käitumist, sellele õhutamist või selle pooldamist
2.2. See kehtib nii ürituse alal (IRL) kui ka üritusega seotud online-keskkondades. 2. See kehtib nii ürituse alal (IRL) kui ka üritusega seotud online-keskkondades.
3. Osaleja kohustub käituma ürituse hoone, inventari ja sisustuse suhtes heaperemehelikult. Keelatud on lõhkuda, määrida või viia mujale esemeid, mis ei kuulu osalejale. 3. Osaleja kohustub käituma ürituse hoone, inventari ja sisustuse suhtes heaperemehelikult. Keelatud on lõhkuda, määrida või viia mujale esemeid, mis ei kuulu osalejale.
3.1. Kui osalejal on ette nähtud korraldajapoolne majutus, siis majutusalal on osalejal kohustus olla vaikselt ning lubada kaaslastel puhata. 1. Kui osalejal on ette nähtud korraldajapoolne majutus, siis majutusalal on osalejal kohustus olla vaikselt ning lubada kaaslastel puhata.
3.2. Majutusalale ei või kaasa kutsuda isikuid, kellel ei ole seal majutust ette nähtud. 2. Majutusalale ei või kaasa kutsuda isikuid, kellel ei ole seal majutust ette nähtud.
4. TipiLAN ei vastuta osaleja isikliku vara eest. 4. TipiLAN ei vastuta osaleja isikliku vara eest.
4.1. Korraldajapoolne majutusala on lukustatav ning kõrvalisi isikuid sinna ei lubata, kuid sellest sõltumata tasub oma väärisesemetel silma peal hoida. 1. Korraldajapoolne majutusala on lukustatav ning kõrvalisi isikuid sinna ei lubata, kuid sellest sõltumata tasub oma väärisesemetel silma peal hoida.
4.2. Kui on tekkinud kahtlus, et on toimunud vargus, tuleb sellest koheselt teavitada korraldajat. 2. Kui on tekkinud kahtlus, et on toimunud vargus, tuleb sellest koheselt teavitada korraldajat.
4.3. Kaotatud asjade leidmisel palume anda need korraldajale või viia need *lost & foundi* (Merchilauda). 3. Kaotatud asjade leidmisel palume anda need korraldajale või viia need *lost & foundi* (Merchilauda).
5. Ürituse alal on keelatud suitsetada ning kasutada vapei. Selleks on õues ette nähtud suitsetamise kohad. 5. Ürituse alal on keelatud suitsetada ning kasutada vapei. Selleks on õues ette nähtud suitsetamise kohad.
6. Üritusele ei tohi kaasa võtta illegaalseid aineid või ravimeid, terariistu, tulirelvi, lõhke- või süüteained ning muid esemeid, mis võivad osalejatele või teistele viga teha. 6. Üritusele ei tohi kaasa võtta illegaalseid aineid või ravimeid, terariistu, tulirelvi, lõhke- või süüteained ning muid esemeid, mis võivad osalejatele või teistele viga teha.
7. Alaealisel osalejal on keelatud tarbida alkoholi või kasutada nikotiini sisaldavaid tooteid. 7. Alaealisel osalejal on keelatud tarbida alkoholi või kasutada nikotiini sisaldavaid tooteid.
7.1. Olles baarist alkoholi ostmas, on osalejal baaritöötaja nõudmisel kohustus näidata isikuttõendavat dokumenti. 1. Olles baarist alkoholi ostmas, on osalejal baaritöötaja nõudmisel kohustus näidata isikuttõendavat dokumenti.
8. Osaleja kohustub käituma alkoholi suhtes vastutustundlikult. 8. Osaleja kohustub käituma alkoholi suhtes vastutustundlikult.
9. Keelatud on igasugune hasartmäng nii raha kui muude hüvede peale. 9. Keelatud on igasugune hasartmäng nii raha kui muude hüvede peale.

View File

@@ -464,7 +464,7 @@
}, },
"intro": { "intro": {
"title": "SISSEJUHATUS", "title": "SISSEJUHATUS",
"description": "TipiLAN korraldas esimese LoL turniiri 2025. aastal oma debüütüritusel. Kohal käis tiime nii Eestist kui ka Lätist.", "description": "League of Legends on juba üle kümne aasta olnud LANide lahutamatu osa. Nii sai ka olema 2025 TipiLANil. Kohale tulid nii Eesti kui ka naabruskonna tippmängijad. Konkurents oli võimas ning tekitas võimsaid emotsioone ja mälestusi. League of Legendsi turniir naaseb ka TipiLAN 2026 raames ning pakub rohkem pinget ja konkurentsi kui kunagi varem!",
"previousWinners": "VARASEMAD VÕITJAD" "previousWinners": "VARASEMAD VÕITJAD"
}, },
"info": { "info": {