23 Commits

Author SHA1 Message Date
c9a8c56a4a Merge pull request #120 from Lapikud/workflow
Forgot to change migrations
2026-04-30 17:19:09 +03:00
a0d2b4933e Forgot to change migrations 2026-04-30 17:18:08 +03:00
64e138299a Merge pull request #119 from Lapikud/workflow
Only allow development branch to be built & deploy
2026-04-30 17:07:50 +03:00
f62f9ae299 Only allow development branch to be built & deploy 2026-04-30 17:05:49 +03:00
2a7424efae Merge pull request #118 from Lapikud/workflow
Main.yml fix
2026-04-30 16:58:42 +03:00
84d2012875 main fix 2026-04-30 16:57:14 +03:00
a2e062596c Merge pull request #117 from Lapikud/workflow
Change workflow to allow dev env
2026-04-30 16:56:04 +03:00
426f71e425 Workflow 2026-04-30 16:54:34 +03:00
Renkar
80f79e1784 Merge pull request #113 from Lapikud/workflow-update
Remove .next cache clear in workflow
2026-03-31 19:09:57 +03:00
c76c50a304 Remove .next cache clear in workflow 2026-03-31 19:08:01 +03:00
Renkar
bdab1b71f1 Merge pull request #112 from Lapikud/workflow-update
Ignore drizzle if branch is not main
2026-03-31 17:53:11 +03:00
fc33c899e2 Ignore drizzle if branch is not main 2026-03-31 17:31:43 +03:00
Renkar
cdbecf4b32 Merge pull request #111 from Lapikud/workflow-update
Attempt 2 for workflow
2026-03-31 17:23:43 +03:00
3b5f0dc2e5 Attempt 2 for workflow 2026-03-31 17:21:33 +03:00
Renkar
7570e6f287 Merge pull request #110 from Lapikud/workflow-update
Change workflow to build teaser-2026 page
2026-03-31 17:16:21 +03:00
7d45acc26f Build teaser-2026 into prod 2026-03-31 16:56:45 +03:00
Renkar
9e9d2c774c Merge pull request #109 from Lapikud/development
one more picture
2026-03-31 09:50:28 +03:00
Arto Reinik
8d4575ef3e frontend: add one more picture for fienta 2026-03-31 09:49:25 +03:00
Renkar
02dbff37c7 Merge pull request #108 from Lapikud/main
up_to_date with main
2026-03-29 20:40:57 +03:00
Renkar
0f3c7dc1d3 Merge pull request #107 from Lapikud/development
add pictures for fienta
2026-03-29 18:10:58 +03:00
TFT
3e542b3544 add banner image 2026-03-29 18:08:47 +03:00
TFT
1c1370251c add pictures for fienta 2026-03-29 16:38:08 +03:00
Renkar
f653c3d59f Merge pull request #106 from Lapikud/development
Disc invite link
2026-03-09 09:15:52 +02:00
204 changed files with 24894 additions and 1282 deletions

View File

@@ -2,21 +2,24 @@ name: build
on:
workflow_call:
inputs:
ref:
description: Branch or tag to checkout
required: false
default: development
type: string
secrets:
USER_AUTH:
required: true
jobs:
build:
runs-on: prox-1
runs-on: prox-2
steps:
- name: Clear .next cache
env:
SUDO_PASSWORD: ${{ secrets.USER_AUTH }}
run: echo "$SUDO_PASSWORD" | sudo -S rm -rf $GITHUB_WORKSPACE/.next
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}
- name: Setup Bun
uses: oven-sh/setup-bun@v2
@@ -28,13 +31,15 @@ jobs:
- name: Ensure symlink to database before Drizzle migrations
run: |
rm -rf $GITHUB_WORKSPACE/data
ln -s ~/data $GITHUB_WORKSPACE/data
rm -rf "$GITHUB_WORKSPACE/data"
ln -s /home/github/data "$GITHUB_WORKSPACE/data"
- name: Generate Drizzle schema
if: ${{ inputs.ref == 'main' }}
run: bun drizzle-kit generate
- name: Run Drizzle migrations
if: ${{ inputs.ref == 'main' }}
run: bun drizzle-kit migrate
- name: Build project

View File

@@ -8,7 +8,7 @@ on:
jobs:
deploy:
runs-on: prox-1
runs-on: prox-2
steps:
- name: Restart NextJS service
env:

View File

@@ -3,7 +3,8 @@ name: main
on:
push:
branches:
- main
- development
workflow_dispatch:
jobs:
build:

BIN
Fienta_sponsorid.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

105
README.md
View File

@@ -1,83 +1,46 @@
# TipiLAN
# 🎮 TIPILAN
Official website for **TipiLAN** — Estonia's largest student-organised LAN event.
**TIPILAN** is the official web platform for the TipiLAN LAN event — built using [Next.js](https://nextjs.org) and powered by the lightning-fast [Bun](https://bun.sh) runtime.
> Work in progress. Event date: **September 11, 2026**.
> ⚠️ This is a work in progress! Contributions welcome.
---
## Tech Stack
## 🚀 Features
- [Next.js 16](https://nextjs.org/) — App Router, SSG, Turbopack
- [React 19](https://react.dev/)
- [TypeScript 5](https://www.typescriptlang.org/)
- [Tailwind CSS 4](https://tailwindcss.com/)
- [next-intl](https://next-intl.dev/) — ET / EN localisation
- [react-icons](https://react-icons.github.io/react-icons/)
Requires **Bun**.
- Event information & schedule
- Stream
- Responsive dark-themed UI
- Built with Next.js, styled with Tailwind (if applicable), powered by Bun
---
## Quickstart
## 📦 Tech Stack
- [Next.js](https://nextjs.org/)
- [Bun](https://bun.sh/)
- [TypeScript](https://www.typescriptlang.org/)
- [React](https://reactjs.org/)
- [Tailwind CSS](https://tailwindcss.com/) *(if used)*
---
## 🛠️ Setup Instructions
📖 See [`docs/SETUP.md`](./docs/SETUP.md) for a full setup guide on:
- ✅ Windows (native)
- 🐧 Windows with WSL
- 🐧 Linux (Ubuntu, Arch, Fedora, etc.)
---
## 🧪 Scripts
```bash
bun install
bun dev
```
bun dev # Run development server
bun run build # Build for production
bun start # Start production server
Open [http://localhost:3000](http://localhost:3000) — redirects to `/et` by default.
---
## Scripts
```bash
bun dev # Dev server (Turbopack, localhost:3000)
bun run build # Production build (outputs SSG for /et and /en)
bun start # Serve production build
bun lint:fix # ESLint with auto-fix
```
---
## Project Structure
```
src/
app/[locale]/ # Locale-based pages (et, en)
components/teaser/ # HeroSection, CarouselSection, EndSection, Footer
components/ # LanguageSwitcher, TeaserPage
i18n/ # next-intl routing + request config
lib/ # blurPlaceholders.ts (auto-generated)
proxy.ts # next-intl routing middleware
translations/ # et.json, en.json
public/images/
backgrounds/ # Full-viewport background WebPs
heros/ # Character/hero image WebPs
flags/ # Language switcher SVGs
original/ # Original PNG sources (not served)
scripts/ # Image processing utilities
```
---
## Image Utilities
When adding or replacing images, re-run:
```bash
# Convert new PNGs → WebP (quality 85)
bun scripts/convert-images.mjs
# Regenerate blur placeholders for all images
bun scripts/gen-blur-placeholders.mjs
```
---
## Localisation
Translation files live in `translations/et.json` and `translations/en.json`.
Routing is handled by `src/proxy.ts``/` redirects to `/et` (default locale).
bun test # Run tests (if configured)
bun run lint # Run linter (if configured)

21
components.json Normal file
View File

@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

55
docs/SETUP.md Normal file
View File

@@ -0,0 +1,55 @@
# Setup
## Prerequisites
- Git
- Bun
- If on Windows, it's recommended to use WSL (Windows Subsystem for Linux) and do the following steps there.
## Installation
1. Clone the repository:
```bash
git clone https://github.com/Lapikud/tipilan.git
```
2. Install bun:
```bash
curl -fsSL https://bun.sh/install | bash
```
3. Install dependencies:
```bash
cd tipilan
bun install
```
4. Run the application:
```bash
bun --bun run dev
```
(ONLY FOR PRODUCTION!!) Build the application:
```bash
bun --bun run build
```
## Accessing the Application
- The application is now running at `http://localhost:3000`.
## Git branch
- The current production branch is `main`.
- Please make sure you make changes in your branch before creating a pull request.
### Making git branch
- Create a new branch:
```bash
git checkout -b <branch-name>
```
- Commit your changes:
```bash
git add .
git commit -m "<commit-message>"
```
- Push your branch:
```bash
git push origin <branch-name>
```
- Create a pull request:
Go to Github,
open up this project's repository and make a new pull request.
```

10
drizzle.config.ts Normal file
View File

@@ -0,0 +1,10 @@
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/db/schema/schema.ts",
out: "./migrations",
dialect: "sqlite",
dbCredentials: {
url: "data/tipilan.db",
},
});

View File

@@ -0,0 +1,43 @@
CREATE TABLE `member` (
`id` text PRIMARY KEY NOT NULL,
`user_id` text NOT NULL,
`team_id` text,
`role` text NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`team_id`) REFERENCES `team`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE UNIQUE INDEX `user_team_unique` ON `member` (`user_id`,`team_id`);--> statement-breakpoint
CREATE TABLE `team` (
`id` text PRIMARY KEY NOT NULL,
`name` text NOT NULL
);
--> statement-breakpoint
CREATE TABLE `tournament_team` (
`id` text PRIMARY KEY NOT NULL,
`tournament_id` text NOT NULL,
`team_id` text NOT NULL,
`registration_date` integer NOT NULL,
FOREIGN KEY (`tournament_id`) REFERENCES `tournament`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`team_id`) REFERENCES `team`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE UNIQUE INDEX `tournament_team_unique` ON `tournament_team` (`tournament_id`,`team_id`);--> statement-breakpoint
CREATE TABLE `tournament` (
`id` text PRIMARY KEY NOT NULL,
`name` text NOT NULL
);
--> statement-breakpoint
CREATE TABLE `user` (
`id` text PRIMARY KEY NOT NULL,
`email` text NOT NULL,
`steam_id` text,
`first_name` text NOT NULL,
`last_name` text NOT NULL,
`ticket_id` text,
`ticket_type` text
);
--> statement-breakpoint
CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint
CREATE UNIQUE INDEX `user_steam_id_unique` ON `user` (`steam_id`);--> statement-breakpoint
CREATE UNIQUE INDEX `user_ticket_id_unique` ON `user` (`ticket_id`);

View File

@@ -0,0 +1 @@
DROP INDEX `user_email_unique`;

View File

@@ -0,0 +1 @@
DROP INDEX `user_steam_id_unique`;

View File

@@ -0,0 +1,295 @@
{
"version": "6",
"dialect": "sqlite",
"id": "efe4e865-a061-4ab0-8023-5211e6d86e14",
"prevId": "00000000-0000-0000-0000-000000000000",
"tables": {
"member": {
"name": "member",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"user_team_unique": {
"name": "user_team_unique",
"columns": [
"user_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"member_user_id_user_id_fk": {
"name": "member_user_id_user_id_fk",
"tableFrom": "member",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"member_team_id_team_id_fk": {
"name": "member_team_id_team_id_fk",
"tableFrom": "member",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"team": {
"name": "team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament_team": {
"name": "tournament_team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"tournament_id": {
"name": "tournament_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"registration_date": {
"name": "registration_date",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"tournament_team_unique": {
"name": "tournament_team_unique",
"columns": [
"tournament_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"tournament_team_tournament_id_tournament_id_fk": {
"name": "tournament_team_tournament_id_tournament_id_fk",
"tableFrom": "tournament_team",
"tableTo": "tournament",
"columnsFrom": [
"tournament_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"tournament_team_team_id_team_id_fk": {
"name": "tournament_team_team_id_team_id_fk",
"tableFrom": "tournament_team",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament": {
"name": "tournament",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"steam_id": {
"name": "steam_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"first_name": {
"name": "first_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"last_name": {
"name": "last_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"ticket_id": {
"name": "ticket_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"ticket_type": {
"name": "ticket_type",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"user_email_unique": {
"name": "user_email_unique",
"columns": [
"email"
],
"isUnique": true
},
"user_steam_id_unique": {
"name": "user_steam_id_unique",
"columns": [
"steam_id"
],
"isUnique": true
},
"user_ticket_id_unique": {
"name": "user_ticket_id_unique",
"columns": [
"ticket_id"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
}
},
"views": {},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}

View File

@@ -0,0 +1,288 @@
{
"version": "6",
"dialect": "sqlite",
"id": "eae7a237-8469-4a6a-acac-1910adfc98ff",
"prevId": "efe4e865-a061-4ab0-8023-5211e6d86e14",
"tables": {
"member": {
"name": "member",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"user_team_unique": {
"name": "user_team_unique",
"columns": [
"user_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"member_user_id_user_id_fk": {
"name": "member_user_id_user_id_fk",
"tableFrom": "member",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"member_team_id_team_id_fk": {
"name": "member_team_id_team_id_fk",
"tableFrom": "member",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"team": {
"name": "team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament_team": {
"name": "tournament_team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"tournament_id": {
"name": "tournament_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"registration_date": {
"name": "registration_date",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"tournament_team_unique": {
"name": "tournament_team_unique",
"columns": [
"tournament_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"tournament_team_tournament_id_tournament_id_fk": {
"name": "tournament_team_tournament_id_tournament_id_fk",
"tableFrom": "tournament_team",
"tableTo": "tournament",
"columnsFrom": [
"tournament_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"tournament_team_team_id_team_id_fk": {
"name": "tournament_team_team_id_team_id_fk",
"tableFrom": "tournament_team",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament": {
"name": "tournament",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"steam_id": {
"name": "steam_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"first_name": {
"name": "first_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"last_name": {
"name": "last_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"ticket_id": {
"name": "ticket_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"ticket_type": {
"name": "ticket_type",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"user_steam_id_unique": {
"name": "user_steam_id_unique",
"columns": [
"steam_id"
],
"isUnique": true
},
"user_ticket_id_unique": {
"name": "user_ticket_id_unique",
"columns": [
"ticket_id"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
}
},
"views": {},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}

View File

@@ -0,0 +1,281 @@
{
"version": "6",
"dialect": "sqlite",
"id": "5d600618-0105-4104-b150-c63015ae55c7",
"prevId": "eae7a237-8469-4a6a-acac-1910adfc98ff",
"tables": {
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"steam_id": {
"name": "steam_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"first_name": {
"name": "first_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"last_name": {
"name": "last_name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"ticket_id": {
"name": "ticket_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"ticket_type": {
"name": "ticket_type",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"user_ticket_id_unique": {
"name": "user_ticket_id_unique",
"columns": [
"ticket_id"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"team": {
"name": "team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"member": {
"name": "member",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"user_team_unique": {
"name": "user_team_unique",
"columns": [
"user_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"member_user_id_user_id_fk": {
"name": "member_user_id_user_id_fk",
"tableFrom": "member",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"member_team_id_team_id_fk": {
"name": "member_team_id_team_id_fk",
"tableFrom": "member",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament_team": {
"name": "tournament_team",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"tournament_id": {
"name": "tournament_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"team_id": {
"name": "team_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"registration_date": {
"name": "registration_date",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"tournament_team_unique": {
"name": "tournament_team_unique",
"columns": [
"tournament_id",
"team_id"
],
"isUnique": true
}
},
"foreignKeys": {
"tournament_team_tournament_id_tournament_id_fk": {
"name": "tournament_team_tournament_id_tournament_id_fk",
"tableFrom": "tournament_team",
"tableTo": "tournament",
"columnsFrom": [
"tournament_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"tournament_team_team_id_team_id_fk": {
"name": "tournament_team_team_id_team_id_fk",
"tableFrom": "tournament_team",
"tableTo": "team",
"columnsFrom": [
"team_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"tournament": {
"name": "tournament",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
}
},
"views": {},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}

View File

@@ -0,0 +1,27 @@
{
"version": "7",
"dialect": "sqlite",
"entries": [
{
"idx": 0,
"version": "6",
"when": 1751642215588,
"tag": "0000_awesome_wendigo",
"breakpoints": true
},
{
"idx": 1,
"version": "6",
"when": 1752632968857,
"tag": "0001_cool_ma_gnuci",
"breakpoints": true
},
{
"idx": 2,
"version": "6",
"when": 1754400044471,
"tag": "0002_real_korath",
"breakpoints": true
}
]
}

View File

@@ -4,9 +4,24 @@ import createNextIntlPlugin from "next-intl/plugin";
const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts");
const nextConfig: NextConfig = {
images: {
qualities: [75, 90],
},
async headers() {
return [
{
source: "/(.*)",
headers: [
{
key: "Content-Security-Policy",
value:
"frame-src 'self' https://tipilan.ee https://player.twitch.tv https://embed.twitch.tv; frame-ancestors 'self' https://tipilan.ee;",
},
{
key: "X-Frame-Options",
value: "SAMEORIGIN",
},
],
},
];
},
};
export default withNextIntl(nextConfig);

10386
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,25 +10,51 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"lint:fix": "next lint --fix"
"drizzle:generate": "drizzle-kit generate:sqlite",
"drizzle:push": "drizzle-kit push:sqlite",
"drizzle:studio": "drizzle-kit studio"
},
"dependencies": {
"next": "^16.2.1",
"@libsql/client": "^0.15.15",
"@paralleldrive/cuid2": "^2.2.2",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tooltip": "^1.2.8",
"@tanstack/react-table": "^8.21.3",
"@types/three": "^0.178.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"drizzle-orm": "^0.44.5",
"lucide-react": "^0.522.0",
"material-symbols": "^0.31.9",
"next": "15.3.0",
"next-intl": "^4.3.9",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-icons": "^5.5.0"
"next-themes": "^0.4.6",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-icons": "^5.5.0",
"react-markdown": "^10.1.0",
"tailwind-merge": "^3.3.1",
"three": "^0.178.0",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@eslint/eslintrc": "^3.3.1",
"@tailwindcss/postcss": "^4.1.13",
"@types/node": "^22.15.0",
"@types/bun": "^1.2.22",
"@types/node": "^20.19.17",
"@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9",
"autoprefixer": "^10.4.21",
"dotenv": "^16.6.1",
"drizzle-kit": "^0.31.4",
"eslint": "^9.36.0",
"eslint-config-next": "^15.3.3",
"eslint-config-next": "15.3.0",
"postcss": "^8.5.6",
"tailwindcss": "^4.1.13",
"ts-node": "^10.9.2",
"typescript": "^5.9.2"
}
}

5928
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

1
public/file.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 391 B

1
public/globe.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
<defs>
<style>
.cls-1 {
fill: #ff343a;
}
.cls-2 {
fill: #00ff50;
}
.cls-3 {
fill: #ff3398;
}
.cls-4 {
fill: #0284ff;
}
.cls-5 {
fill: #ffc703;
}
</style>
</defs>
<g>
<path class="cls-5" d="M147.26,50.24h-46.56c-29.7,0-53.78,24.08-53.78,53.78v322.66c0,29.7,24.08,53.78,53.78,53.78h46.56c118.61,0,215.11-96.5,215.11-215.11S265.87,50.24,147.26,50.24ZM154.48,372.67v-214.63c55.95,3.73,100.34,50.43,100.34,107.31s-44.38,103.59-100.34,107.31Z"/>
<path class="cls-4" d="M1424.13,50.24c-29.7,0-53.78,24.08-53.78,53.78v218.47c0,27.8-22.62,50.42-50.42,50.42s-50.42-22.62-50.42-50.42V104.02c0-29.7-24.08-53.78-53.78-53.78s-53.78,24.08-53.78,53.78v218.47c0,87.1,70.86,157.97,157.97,157.97s157.97-70.87,157.97-157.97V104.02c0-29.7-24.08-53.78-53.78-53.78Z"/>
<path class="cls-3" d="M666.67,157.8c29.7,0,53.78-24.08,53.78-53.78s-24.08-53.78-53.78-53.78h-174.78c-29.7,0-53.78,24.08-53.78,53.78v322.66c0,29.7,24.08,53.78,53.78,53.78h174.78c29.7,0,53.78-24.08,53.78-53.78s-24.08-53.78-53.78-53.78h-121v-53.78h121c29.7,0,53.78-24.08,53.78-53.78s-24.08-53.78-53.78-53.78h-121v-53.78h121Z"/>
<path class="cls-2" d="M100.71,599.52c-29.7,0-53.78,24.08-53.78,53.78v322.66c0,29.7,24.08,53.78,53.78,53.78s53.78-24.08,53.78-53.78v-322.66c0-29.7-24.08-53.78-53.78-53.78Z"/>
<path class="cls-2" d="M1064.09,372.91h-154.61V104.02c0-29.7-24.08-53.78-53.78-53.78s-53.78,24.08-53.78,53.78v322.66c0,29.7,24.08,53.78,53.78,53.78h208.39c29.7,0,53.78-24.08,53.78-53.78s-24.08-53.78-53.78-53.78Z"/>
<path class="cls-1" d="M1819.29,922.19h-154.61v-268.88c0-29.7-24.08-53.78-53.78-53.78s-53.78,24.08-53.78,53.78v322.66c0,29.7,24.08,53.78,53.78,53.78h208.39c29.7,0,53.78-24.08,53.78-53.78s-24.08-53.78-53.78-53.78Z"/>
<path class="cls-5" d="M1353.21,634.4c-7.86-20.95-27.86-34.84-50.23-34.89h-.12c-22.32,0-42.33,13.79-50.26,34.67l-122.68,322.66c-10.55,27.76,3.39,58.82,31.16,69.38,27.76,10.56,58.82-3.39,69.38-31.15l72.07-189.54,70.99,189.31c8.1,21.59,28.59,34.91,50.36,34.91,6.27,0,12.65-1.11,18.87-3.44,27.81-10.43,41.9-41.43,31.47-69.23l-121-322.66Z"/>
<path class="cls-4" d="M993.75,599.52c-29.7,0-53.78,24.08-53.78,53.78v140.27l-109.43-169.45c-12.94-20.03-37.52-29.15-60.38-22.41-22.87,6.74-38.57,27.74-38.57,51.58v322.66c0,29.7,24.08,53.78,53.78,53.78s53.78-24.08,53.78-53.78v-140.27l109.43,169.45c10.09,15.62,27.26,24.61,45.18,24.61,5.06,0,10.17-.72,15.21-2.2,22.87-6.74,38.57-27.74,38.57-51.58v-322.66c0-29.7-24.08-53.78-53.78-53.78Z"/>
<path class="cls-3" d="M1870.74,208.11c0-87.05-70.82-157.86-157.86-157.86-41.3,0-77.48,10.14-104.63,29.31-34.33,24.25-53.23,62.01-53.23,106.31,0,24.5,7.18,57.43,38.23,85.23-22.12,6.67-38.23,27.2-38.23,51.49,0,87.05,70.82,157.86,157.86,157.86,41.77,0,76.58-9.1,103.46-27.05,35.08-23.42,54.4-60.95,54.4-105.66,0-25.05-7.86-59.2-42.83-86.99,24.45-5.06,42.83-26.71,42.83-52.66ZM1712.88,372.91c-27.74,0-50.31-22.57-50.31-50.31,0-5.01-.69-9.86-1.97-14.46,12.7,4.54,25.66,8.47,38.43,12.34,18.06,5.48,35.12,10.65,48.33,16.68,11.18,5.1,15.06,9.2,15.06,12.77,0,16.85-25.7,22.97-49.55,22.97ZM1730.25,217.55c-22.59-6.85-45.67-14.41-59.79-22.57-5.1-2.95-7.89-7.91-7.89-13.44,0-7.07,3.82-11.37,7.74-14.14,8.64-6.1,24.15-9.6,42.57-9.6,27.74,0,50.31,22.57,50.31,50.31,0,7.62,1.58,14.87,4.44,21.43-12.35-4.39-24.96-8.22-37.38-11.98Z"/>
<path class="cls-1" d="M442.11,599.52c-118.61,0-215.11,96.5-215.11,215.11s96.5,215.11,215.11,215.11,215.11-96.5,215.11-215.11-96.5-215.11-215.11-215.11ZM442.11,922.18c-59.31,0-107.55-48.25-107.55-107.55s48.25-107.55,107.55-107.55,107.55,48.25,107.55,107.55-48.25,107.55-107.55,107.55Z"/>
</g>
<g>
<path d="M147.27,493.9h-46.56c-37.07,0-67.22-30.15-67.22-67.22V104.02c0-37.07,30.15-67.22,67.22-67.22h46.56c126.02,0,228.55,102.53,228.55,228.55s-102.53,228.55-228.55,228.55ZM100.71,63.69c-22.24,0-40.33,18.09-40.33,40.33v322.66c0,22.24,18.09,40.33,40.33,40.33h46.56c111.2,0,201.66-90.47,201.66-201.66S258.46,63.69,147.27,63.69h-46.56ZM141.04,387.04v-243.37l14.34.96c63.3,4.21,112.89,57.24,112.89,120.73s-49.59,116.52-112.89,120.73l-14.34.96ZM167.93,173.53v183.65c42.17-9.48,73.45-47.36,73.45-91.83s-31.27-82.34-73.45-91.82Z"/>
<path d="M1319.94,493.9c-94.52,0-171.41-76.9-171.41-171.42V104.02c0-37.07,30.15-67.22,67.22-67.22s67.22,30.15,67.22,67.22v218.47c0,20.39,16.58,36.97,36.97,36.97s36.97-16.59,36.97-36.97V104.02c0-37.07,30.15-67.22,67.22-67.22s67.22,30.15,67.22,67.22v218.47c0,94.52-76.9,171.42-171.42,171.42ZM1215.75,63.69c-22.24,0-40.33,18.09-40.33,40.33v218.47c0,79.69,64.83,144.53,144.52,144.53s144.53-64.83,144.53-144.53V104.02c0-22.24-18.09-40.33-40.33-40.33s-40.33,18.09-40.33,40.33v218.47c0,35.21-28.65,63.86-63.86,63.86s-63.86-28.65-63.86-63.86V104.02c0-22.24-18.09-40.33-40.33-40.33Z"/>
<path d="M666.67,493.9h-174.78c-37.07,0-67.22-30.15-67.22-67.22V104.02c0-37.07,30.15-67.22,67.22-67.22h174.78c37.07,0,67.22,30.15,67.22,67.22s-30.15,67.22-67.22,67.22h-107.55v26.89h107.55c37.07,0,67.22,30.15,67.22,67.22s-30.15,67.22-67.22,67.22h-107.55v26.89h107.55c37.07,0,67.22,30.15,67.22,67.22s-30.15,67.22-67.22,67.22ZM491.9,63.69c-22.24,0-40.33,18.09-40.33,40.33v322.66c0,22.24,18.09,40.33,40.33,40.33h174.78c22.24,0,40.33-18.09,40.33-40.33s-18.09-40.33-40.33-40.33h-121c-7.42,0-13.44-6.02-13.44-13.44v-53.78c0-7.42,6.02-13.44,13.44-13.44h121c22.24,0,40.33-18.09,40.33-40.33s-18.09-40.33-40.33-40.33h-121c-7.42,0-13.44-6.02-13.44-13.44v-53.78c0-7.42,6.02-13.44,13.44-13.44h121c22.24,0,40.33-18.09,40.33-40.33s-18.09-40.33-40.33-40.33h-174.78Z"/>
<path d="M100.71,1043.17c-37.07,0-67.22-30.15-67.22-67.22v-322.66c0-37.06,30.15-67.22,67.22-67.22s67.22,30.15,67.22,67.22v322.66c0,37.06-30.15,67.22-67.22,67.22ZM100.71,612.96c-22.24,0-40.33,18.09-40.33,40.33v322.66c0,22.24,18.09,40.33,40.33,40.33s40.33-18.09,40.33-40.33v-322.66c0-22.24-18.09-40.33-40.33-40.33Z"/>
<path d="M1064.09,493.9h-208.38c-37.07,0-67.22-30.15-67.22-67.22V104.02c0-37.07,30.16-67.22,67.22-67.22s67.22,30.15,67.22,67.22v255.44h141.16c37.07,0,67.22,30.15,67.22,67.22s-30.15,67.22-67.22,67.22ZM855.71,63.69c-22.24,0-40.33,18.09-40.33,40.33v322.66c0,22.24,18.09,40.33,40.33,40.33h208.38c22.24,0,40.33-18.09,40.33-40.33s-18.09-40.33-40.33-40.33h-168.05V104.02c0-22.24-18.09-40.33-40.33-40.33Z"/>
<path d="M1819.29,1043.18h-208.38c-37.07,0-67.22-30.15-67.22-67.22v-322.66c0-37.06,30.15-67.22,67.22-67.22s67.22,30.15,67.22,67.22v255.44h141.17c37.07,0,67.22,30.15,67.22,67.22s-30.15,67.22-67.22,67.22ZM1610.91,612.97c-22.24,0-40.33,18.09-40.33,40.33v322.66c0,22.24,18.09,40.33,40.33,40.33h208.38c22.24,0,40.33-18.09,40.33-40.33s-18.09-40.33-40.33-40.33h-154.61c-7.43,0-13.44-6.02-13.44-13.44v-268.89c0-22.24-18.09-40.33-40.33-40.33Z"/>
<path d="M1180.2,1043.21c-8.07,0-16.15-1.47-23.91-4.42-16.78-6.38-30.08-18.92-37.43-35.3-7.36-16.38-7.9-34.64-1.51-51.43l122.68-322.66c9.85-25.92,35.1-43.33,62.83-43.33,27.95.07,53.18,17.59,62.94,43.62h0l121,322.66c6.31,16.81,5.69,35.07-1.75,51.42-7.43,16.35-20.78,28.82-37.59,35.13-7.6,2.85-15.54,4.29-23.59,4.29-27.87,0-53.16-17.53-62.95-43.63l-58.49-155.98-59.41,156.26c-6.38,16.78-18.92,30.08-35.3,37.43-8.8,3.95-18.15,5.93-27.51,5.93ZM1302.94,612.95c-16.73,0-31.88,10.45-37.79,26l-122.68,322.66c-3.83,10.07-3.51,21.03.91,30.86,4.42,9.83,12.39,17.35,22.46,21.18,10.06,3.83,21.02,3.51,30.85-.91,9.83-4.41,17.35-12.39,21.18-22.46l72.06-189.54c1.98-5.22,6.98-8.67,12.57-8.67h.03c5.59.01,10.6,3.49,12.56,8.72l70.99,189.32c5.87,15.66,21.06,26.18,37.77,26.18,4.82,0,9.58-.87,14.15-2.58,20.82-7.81,31.41-31.1,23.6-51.93l-120.99-322.66c-5.86-15.62-21-26.13-37.68-26.17Z"/>
<path d="M993.76,1043.18c-22.92,0-44.03-11.5-56.47-30.75l-84.7-131.14v94.67c0,37.06-30.15,67.22-67.22,67.22s-67.22-30.15-67.22-67.22v-322.66c0-29.59,19.83-56.11,48.21-64.48,28.38-8.36,59.42,3.16,75.48,28.01l84.69,131.14v-94.67c0-37.06,30.15-67.22,67.22-67.22s67.22,30.15,67.22,67.22v322.66c0,29.59-19.83,56.11-48.21,64.48-6.18,1.82-12.58,2.74-19.01,2.74ZM839.14,822.24c4.48,0,8.77,2.25,11.29,6.15l109.44,169.45c7.46,11.56,20.13,18.46,33.88,18.46,3.86,0,7.69-.56,11.4-1.65,17.03-5.02,28.93-20.93,28.93-38.68v-322.66c0-22.24-18.09-40.33-40.33-40.33s-40.33,18.09-40.33,40.33v140.27c0,5.96-3.93,11.21-9.64,12.9-5.72,1.67-11.86-.6-15.1-5.6l-109.43-169.45c-9.63-14.92-28.26-21.85-45.29-16.81-17.03,5.02-28.92,20.93-28.92,38.68v322.66c0,22.24,18.09,40.33,40.33,40.33s40.33-18.09,40.33-40.33v-140.27c0-5.96,3.93-11.21,9.64-12.9,1.26-.37,2.54-.55,3.8-.55Z"/>
<path d="M1712.88,493.9c-94.46,0-171.31-76.85-171.31-171.31,0-22.37,11.37-43.03,29.19-55.38-23.75-28.24-29.19-59.06-29.19-81.34,0-48.8,20.92-90.45,58.92-117.3,29.43-20.79,68.29-31.78,112.39-31.78,94.46,0,171.31,76.85,171.31,171.31,0,23.66-12.53,45.08-31.78,57.1,25.83,28.18,31.78,59.59,31.78,82.55,0,49.34-21.45,90.84-60.38,116.84-29.13,19.45-66.45,29.31-110.92,29.31ZM1712.88,63.69c-38.51,0-72.01,9.28-96.87,26.85-30.66,21.66-47.55,55.52-47.55,95.33,0,29.86,11.35,55.16,33.75,75.22,3.62,3.24,5.21,8.19,4.16,12.93s-4.59,8.55-9.24,9.95c-16.88,5.09-28.66,20.97-28.66,38.62,0,79.63,64.79,144.42,144.42,144.42,39.06,0,71.36-8.34,95.99-24.79,31.23-20.85,48.43-54.4,48.43-94.48,0-30.84-12.7-56.56-37.75-76.46-4.08-3.25-5.93-8.56-4.72-13.64,1.21-5.08,5.25-9,10.36-10.06,18.6-3.85,32.11-20.46,32.11-39.49,0-79.63-64.79-144.42-144.42-144.42ZM1712.88,386.35c-35.15,0-63.75-28.6-63.75-63.75,0-3.69-.49-7.34-1.47-10.86-1.35-4.84.11-10.03,3.79-13.45,3.68-3.42,8.96-4.51,13.69-2.82,12.35,4.42,25.23,8.32,37.67,12.1,18.63,5.65,36.1,10.95,50.15,17.36,6.86,3.13,22.92,10.46,22.92,25,0,22.8-23.55,36.42-62.99,36.42ZM1676.35,327.57c2.43,17.99,17.89,31.89,36.53,31.89s30.38-3.96,34.49-7.21c-1.29-.76-3.09-1.72-5.58-2.86-12.41-5.66-29.04-10.71-46.65-16.05-6.21-1.88-12.49-3.79-18.78-5.78ZM1767.62,242.98c-1.51,0-3.03-.25-4.5-.78-12.03-4.28-24.58-8.09-36.71-11.77l3.84-12.88-3.9,12.87c-23.43-7.11-47.24-14.91-62.62-23.8-9.14-5.28-14.6-14.66-14.6-25.08,0-7.13,2.33-17.28,13.42-25.12,11.02-7.78,28.89-12.07,50.33-12.07,35.15,0,63.75,28.6,63.75,63.75,0,5.59,1.12,11,3.33,16.07,2.14,4.91,1.16,10.63-2.5,14.54-2.59,2.77-6.17,4.27-9.83,4.27ZM1712.88,171.24c-18.22,0-29.93,3.69-34.82,7.14-2.05,1.45-2.05,2.24-2.05,3.16,0,.57.09,1.17,1.17,1.8,13.05,7.55,36.12,15.03,56.96,21.35l-3.9,12.87,3.96-12.85c5.12,1.55,10.32,3.13,15.55,4.76,0-.45-.01-.91-.01-1.36,0-20.33-16.53-36.86-36.86-36.86Z"/>
<path d="M442.11,1043.17c-126.02,0-228.55-102.53-228.55-228.55s102.53-228.55,228.55-228.55,228.55,102.53,228.55,228.55-102.53,228.55-228.55,228.55ZM442.11,612.96c-111.2,0-201.66,90.47-201.66,201.66s90.47,201.66,201.66,201.66,201.66-90.47,201.66-201.66-90.47-201.66-201.66-201.66ZM442.11,935.62c-66.72,0-121-54.28-121-121s54.28-121,121-121,121,54.28,121,121-54.28,121-121,121ZM442.11,720.51c-51.89,0-94.11,42.22-94.11,94.11s42.22,94.11,94.11,94.11,94.11-42.22,94.11-94.11-42.22-94.11-94.11-94.11Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
public/images/EXPO/baar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

View File

@@ -1,6 +0,0 @@
<svg width="40" height="30" viewBox="0 0 40 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4.68346V9.23077H6.25333L0 4.68346ZM5.18222 30H14.4444V23.265L5.18222 30ZM25.5556 23.2662V30H34.8167L25.5556 23.2662ZM0 20.7692V25.3165L6.25556 20.7692H0ZM34.8189 0H25.5556V6.735L34.8189 0ZM40 25.3177V20.7692H33.7433L40 25.3177ZM40 9.23077V4.68346L33.7456 9.23077H40ZM14.4444 0H5.18222L14.4444 6.735V0Z" fill="#00247D"/>
<path d="M27.9332 20.7696L38.7243 28.6169C39.2513 28.0531 39.6301 27.3583 39.8243 26.5989L31.8076 20.7696H27.9332ZM14.4443 20.7696H12.0654L1.27543 28.6158C1.85432 29.2273 2.59654 29.6646 3.42876 29.8677L14.4443 21.8577V20.7696ZM25.5554 9.23118H27.9343L38.7243 1.38503C38.1355 0.764575 37.3891 0.330442 36.5721 0.133104L25.5554 8.1431V9.23118ZM12.0654 9.23118L1.27543 1.38503C0.748709 1.94923 0.369666 2.64392 0.174316 3.4031L8.19098 9.23118H12.0654Z" fill="#C8102E"/>
<path d="M40 18.4615H23.3333V30H25.5556V23.2662L34.8167 30H35.5556C36.1458 30.0001 36.7302 29.8778 37.2744 29.6402C37.8185 29.4026 38.3114 29.055 38.7243 28.6169L27.9332 20.7696H31.8076L39.8243 26.5989C39.9276 26.21 40 25.8069 40 25.3846V25.3177L33.7433 20.7692H40V18.4615ZM0 18.4615V20.7692H6.25556L0 25.3165V25.3846C0 26.6435 0.48765 27.7827 1.27543 28.6158L12.0654 20.7696H14.4443V21.8577L3.42889 29.8662C3.75556 29.9469 4.09333 30 4.44444 30H5.18222L14.4444 23.265V30H16.6667V18.4615H0ZM40 4.61538C40.0007 3.40613 39.5422 2.24574 38.7243 1.38503L27.9343 9.23118H25.5554V8.1431L36.5721 0.133104C36.2393 0.0483274 35.8982 0.00339006 35.5556 4.3659e-07L34.8189 0L25.5556 6.735V0L23.3333 4.3659e-07V11.5385H40V9.23077H33.7456L40 4.68346V4.61538ZM14.4444 0V6.735L5.18222 0L4.44444 4.3659e-07C3.85403 -0.000266737 3.26952 0.122092 2.72531 0.359879C2.1811 0.597666 1.68805 0.946488 1.27543 1.38503L12.0654 9.23118H8.19098L0.174316 3.4031C0.0640721 3.79738 0.00552601 4.20486 0 4.61538V4.68346L6.25333 9.23077H0V11.5385H16.6667V4.3659e-07L14.4444 0Z" fill="white"/>
<path d="M23.3333 11.5385V4.3659e-07H16.6667V11.5385H0V18.4615H16.6667V30H23.3333V18.4615H40V11.5385H23.3333Z" fill="#C8102E"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,5 +0,0 @@
<svg width="40" height="30" viewBox="0 0 40 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M35.5556 0H4.44444C3.2657 0 2.13524 0.468252 1.30175 1.30175C0.468253 2.13524 0 3.2657 0 4.44444V10H40V4.44444C40 3.2657 39.5317 2.13524 38.6983 1.30175C37.8648 0.468252 36.7343 0 35.5556 0Z" fill="#0072CE"/>
<path d="M0 10H40V20H0V10Z" fill="black"/>
<path d="M35.5556 30H4.44444C3.2657 30 2.13524 29.4732 1.30175 28.5355C0.468253 27.5979 0 26.3261 0 25V20H40V25C40 26.3261 39.5317 27.5979 38.6983 28.5355C37.8648 29.4732 36.7343 30 35.5556 30Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1015 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

1
public/next.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

BIN
public/sponsors/BFGL.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 KiB

BIN
public/sponsors/EVAL.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Some files were not shown because too many files have changed in this diff Show More