BIN
public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
public/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
3
public/favicon.svg
Normal file
|
After Width: | Height: | Size: 406 KiB |
21
public/site.webmanifest
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "MyWebSite",
|
||||
"short_name": "MySite",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/web-app-manifest-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/web-app-manifest-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
}
|
||||
],
|
||||
"theme_color": "#ffffff",
|
||||
"background_color": "#ffffff",
|
||||
"display": "standalone"
|
||||
}
|
||||
BIN
public/web-app-manifest-192x192.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/web-app-manifest-512x512.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
@ -20,6 +20,7 @@
|
||||
<script lang="ts">
|
||||
import {t} from "astro-i18n";
|
||||
import {statsRepo} from "@repo/stats.ts";
|
||||
import "@styles/table.css"
|
||||
|
||||
|
||||
interface Props {
|
||||
@ -64,7 +65,3 @@
|
||||
<p>{error.message}</p>
|
||||
{/await}
|
||||
|
||||
<style>
|
||||
@import "../styles/table.css";
|
||||
</style>
|
||||
|
||||
|
||||
@ -79,6 +79,8 @@
|
||||
})
|
||||
},
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
|
||||
scales: {
|
||||
x: {
|
||||
type: "time",
|
||||
@ -105,5 +107,5 @@
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<canvas bind:this={canvas}></canvas>
|
||||
<canvas height="500" bind:this={canvas}></canvas>
|
||||
</div>
|
||||
@ -101,6 +101,8 @@
|
||||
<a href={l("/rules/microwargear")}
|
||||
class="btn btn-gray">{t("navbar.links.rules.micro")}</a>
|
||||
<a href={l("/rules/streetfight")} class="btn btn-gray">{t("navbar.links.rules.sf")}</a>
|
||||
<h2 class="px-2 text-gray-300">{t("navbar.links.rules.ranked")}</h2>
|
||||
<a href={l("/rangliste/missilewars")} class="btn btn-gray">{t("navbar.links.ranked.mw")}</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- TODO: Add help center
|
||||
|
||||
@ -43,7 +43,5 @@
|
||||
maximumFractionDigits: 2
|
||||
}).format(data.playtime)})}h</p>
|
||||
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
|
||||
{#if user.perms.includes("CHECK")}
|
||||
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
||||
{/if}
|
||||
{/await}
|
||||
@ -21,7 +21,7 @@
|
||||
import {createEventDispatcher} from "svelte";
|
||||
import {schemRepo} from "@repo/schem.ts";
|
||||
import SWModal from "@components/styled/SWModal.svelte";
|
||||
import {t} from "astro-i18n"
|
||||
import {t} from "astro-i18n";
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
@ -31,9 +31,11 @@
|
||||
|
||||
let {open = $bindable(false)}: Props = $props();
|
||||
|
||||
async function upload() {
|
||||
async function upload(e: Event) {
|
||||
e.stopPropagation();
|
||||
if (uploadFile == null) {
|
||||
return
|
||||
error = "dashboard.schematic.errors.noFile";
|
||||
return;
|
||||
}
|
||||
let file = uploadFile[0];
|
||||
|
||||
@ -42,33 +44,46 @@
|
||||
let type = name.split(".").pop();
|
||||
|
||||
if (type !== "schem" && type !== "schematic") {
|
||||
return
|
||||
error = "dashboard.schematic.errors.invalidEnding";
|
||||
return;
|
||||
}
|
||||
|
||||
let content = await file.arrayBuffer();
|
||||
|
||||
// @ts-ignore
|
||||
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
||||
|
||||
let response = await $schemRepo.uploadSchematic(name, b64);
|
||||
try {
|
||||
await $schemRepo.uploadSchematic(name, b64);
|
||||
|
||||
open = false;
|
||||
value = "";
|
||||
dispatch("reset")
|
||||
dispatch("reset");
|
||||
} catch (e) {
|
||||
error = "dashboard.schematic.errors.upload";
|
||||
}
|
||||
}
|
||||
|
||||
function reset(e: Event) {
|
||||
e.stopPropagation();
|
||||
open = false
|
||||
value = "";
|
||||
}
|
||||
|
||||
let uploadFile: FileList | null = $state(null);
|
||||
let value = $state("");
|
||||
let error = $state(null)
|
||||
</script>
|
||||
|
||||
<SWModal title={t("dashboard.schematic.title")} bind:open>
|
||||
<form>
|
||||
<input type="file" bind:files={uploadFile} bind:value />
|
||||
<label for="schem-upload">{t("dashboard.schematic.title")}</label>
|
||||
<input type="file" id="schem-upload" bind:files={uploadFile} class="overflow-ellipsis" bind:value accept=".schem, .schematic"/>
|
||||
{#if error !== null}
|
||||
<p class="text-red-400">{t(error)}</p>
|
||||
{/if}
|
||||
</form>
|
||||
{#snippet footer()}
|
||||
|
||||
<button class="btn !ml-auto" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
||||
<button class="btn btn-gray" onclick={() => open = false}>{t("dashboard.schematic.cancel")}</button>
|
||||
|
||||
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
||||
<button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
|
||||
{/snippet}
|
||||
</SWModal>
|
||||
@ -68,16 +68,18 @@
|
||||
})
|
||||
</script>
|
||||
|
||||
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full max-w-md w-full rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
||||
<div onclick={stopPropagation(onclick)} aria-hidden="true">
|
||||
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full min-w-md w-fit rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
||||
<div onclick={stopPropagation(onclick)} aria-hidden="true" class="w-fit">
|
||||
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
|
||||
<h1 class="text-4xl font-bold">{title}</h1>
|
||||
</div>
|
||||
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
|
||||
{@render children?.()}
|
||||
</div>
|
||||
<div class="flex mx-4 my-2 p-6" onclick={() => dialog.close()} aria-hidden="true">
|
||||
<div class="mx-4 my-2 p-6">
|
||||
<div class="ml-auto flex justify-end" onclick={() => dialog.close()} aria-hidden="true">
|
||||
{@render footer?.()}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
@ -18,6 +18,7 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
|
||||
- Design-Regel: **Weihnachtliches/Winterliches Design**
|
||||
|
||||
## Regeln:
|
||||
|
||||
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
|
||||
- **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
|
||||
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
|
||||
@ -33,6 +34,6 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
|
||||
- Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG – Designcontest)
|
||||
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung
|
||||
|
||||
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 * Fightplatzierung + 0,33 * Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
||||
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 _ Fightplatzierung + 0,33 _ Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
||||
|
||||
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||
28
src/content/announcements/de/sw-arcade.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
title: SteamWar Arcade
|
||||
description: "Das erste SteamWar Arcade Event: MissleWars, TowerRun und TNTLeague"
|
||||
key: steamwar-arcade
|
||||
created: 2025-04-14
|
||||
tags:
|
||||
- event
|
||||
- towerrun
|
||||
- misslewars
|
||||
- tntleague
|
||||
- arcade
|
||||
image: ../../../images/sw-arcade-image.png
|
||||
---
|
||||
|
||||
**Ahoi Liebe Community,**
|
||||
|
||||
Am **18. Mai** feiert SteamWar seinen 6. Geburtstag. Zur Feier dieses Meilensteins werden wir ein kleines Event veranstalten: **SteamWar Arcade**
|
||||
|
||||
- Anmeldeschluss ist der **11.5.2025**
|
||||
- In jedem Modus können bis zu **drei Personen** an einem Kampf teilnehmen
|
||||
|
||||
## Ablauf:
|
||||
|
||||
- Es gibt drei Modi zur Auswahl: **TowerRun**, **TNTLeague** und **MissleWars**
|
||||
- Die Teams stimmen 5 Minuten vor Beginn den Modus ab. Sind die Teams sich einig, wird dieser Modus gespielt. Sind die Teams sich nicht einig, wird der dritte Modus gespielt.
|
||||
- Es wird eine einfache Gruppenphase geben: alle gegen alle
|
||||
|
||||
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||
@ -14,13 +14,12 @@ tags:
|
||||
|
||||
| Platzierung | Team | Punkte |
|
||||
|-------------|-------------|--------|
|
||||
| 1. | ABYSS | 0 |
|
||||
| | BlackFire | 0 |
|
||||
| | Borg | 0 |
|
||||
| | Halcyon | 0 |
|
||||
| | Happy-End | 0 |
|
||||
| | Pulse | 0 |
|
||||
| | TheNoobTeam | 0 |
|
||||
| 1. | Halcyon | 10 |
|
||||
| 2. | Happy-End | 8 |
|
||||
| 3. | ABYSS | 5 |
|
||||
| 4. | Borg | 4 |
|
||||
| 5. | BlackFire | 2 |
|
||||
| 6. | TheNoobTeam | 1 |
|
||||
|
||||
### Aktueller Spieltag
|
||||
|
||||
@ -30,42 +29,44 @@ tags:
|
||||
|
||||
| 01.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | HPY vs ABYS | / |
|
||||
| 19:30 | Borg vs Hlcy | / |
|
||||
| 20:00 | TNT vs BF | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 19:00 | HPY vs ABYS | HPY qualifiziert |
|
||||
| 19:30 | Borg vs Hlcy | Hlcy qualifiziert |
|
||||
| 20:00 | TNT vs BF | TNT qualifiziert |
|
||||
| 20:30 | ABYS vs Borg | Sieg ABYS |
|
||||
| 21:00 | Borg vs BF | Sieg Borg |
|
||||
| 21:30 | BF vs ABYS | ABYS, Borg qualifiziert |
|
||||
|
||||
PL hat sich nach der Qualifikation zurückgezogen, womit BF nachgerückt ist.
|
||||
|
||||
### 1. Spieltag
|
||||
|
||||
| 08.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | ABYS vs Borg | Sieg ABYS |
|
||||
| 19:30 | Hlcy vs HPY | Sieg Hlcy |
|
||||
| 20:00 | BF vs TNT | Sieg TNT |
|
||||
| 20:30 | HPY vs ABYS | Sieg HPY |
|
||||
| 21:00 | Borg vs BF | Sieg Borg |
|
||||
| 21:30 | TNT vs Hlcy | Sieg Hlcy |
|
||||
|
||||
### 2. Spieltag
|
||||
|
||||
| 15.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | HPY vs TNT | Sieg HPY |
|
||||
| 19:30 | ABYS vs BF | Sieg ABYS |
|
||||
| 20:00 | Borg vs Hlcy | Sieg Hlcy |
|
||||
| 20:30 | BF vs HPY | Sieg HPY |
|
||||
| 21:00 | TNT vs Borg | Sieg Borg |
|
||||
| 21:30 | Hlcy vs ABYS | Sieg Hlcy |
|
||||
|
||||
### 3. Spieltag
|
||||
|
||||
| 22.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
|------------|-------------|----------|
|
||||
| 19:00 | ABYS vs TNT | Sieg ABYS |
|
||||
| 19:30 | Borg vs HPY | Sieg HPY |
|
||||
| 20:00 | Hlcy vs BF | Sieg Hlcy |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
@ -73,32 +74,32 @@ tags:
|
||||
### 4. Spieltag
|
||||
|
||||
| 29.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | TNT vs ABYS | Sieg ABYS |
|
||||
| 19:30 | HPY vs Borg | Sieg HPY |
|
||||
| 20:00 | BF vs Hlcy | Sieg Hlcy |
|
||||
| 20:30 | Borg vs TNT | Sieg Borg |
|
||||
| 21:00 | HPY vs BF | Sieg HPY |
|
||||
| 21:30 | ABYS vs Hlcy | Sieg Hlcy |
|
||||
|
||||
### 5. Spieltag
|
||||
|
||||
| 05.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | TNT vs HPY | Sieg HPY |
|
||||
| 19:30 | BF vs ABYS | Sieg BF |
|
||||
| 20:00 | Hlcy vs Borg | Sieg Hlcy |
|
||||
| 20:30 | ABYS vs HPY | Sieg HPY |
|
||||
| 21:00 | BF vs Borg | Sieg Borg |
|
||||
| 21:30 | Hlcy vs TNT | Sieg Hlcy |
|
||||
|
||||
### 6. Spieltag
|
||||
|
||||
| 12.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | Borg vs ABYS | Sieg ABYS |
|
||||
| 19:30 | HPY vs Hlcy | Sieg Hlcy |
|
||||
| 20:00 | TNT vs BF | Sieg BF |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
|
||||
@ -4,7 +4,8 @@
|
||||
"url": {
|
||||
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar",
|
||||
"1.20.6": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.1.0/AdvancedScripts-2.1.0.jar",
|
||||
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar"
|
||||
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar",
|
||||
"Hotkey script": "https://git.steamwar.de/SteamWar/SteamWar/src/branch/main/BauSystem/hotkeys.lua"
|
||||
},
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
|
||||
}
|
||||
@ -2,7 +2,8 @@
|
||||
"name": "SteamWarTeamserver",
|
||||
"description": "Dieses Plugin ermöglicht die einfache Einbindung deines Servers in SteamWar. Wie du deinen (Team-)Server über SteamWar erreichbar machen kannst findest du hier.",
|
||||
"url": {
|
||||
"Info": "/teamserverintegration"
|
||||
"Info": "/teamserverintegration",
|
||||
"Download": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration/releases/download/latest/SteamWarTeamserverIntegration.jar"
|
||||
},
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarBungeeTeamserver"
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration"
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
{
|
||||
"translationKey": "microwg",
|
||||
"main": false
|
||||
"main": false,
|
||||
"ranked": true
|
||||
}
|
||||
5
src/content/modes/missilewars.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"translationKey": "mw",
|
||||
"main": false,
|
||||
"ranked": true
|
||||
}
|
||||
@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "Graf Spree",
|
||||
"name": "Graf Spee",
|
||||
"description": "A simple, lightweight description of a frostbite.",
|
||||
"id": 123,
|
||||
"creator": ["Test", "Test2"],
|
||||
"gamemode": "warship",
|
||||
"image": "../../../images/publics/grafspree/area_render.png",
|
||||
"image": "../../../images/publics/grafspee/area_render.png",
|
||||
"3d": false
|
||||
}
|
||||
3
src/content/rules/de/missilewars.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
translationKey: mw
|
||||
---
|
||||
@ -87,7 +87,10 @@
|
||||
"title": "Hilfe",
|
||||
"docs": "Dokumentation"
|
||||
},
|
||||
"account": "Konto"
|
||||
"account": "Konto",
|
||||
"ranked": {
|
||||
"mw": "MissileWars"
|
||||
}
|
||||
}
|
||||
},
|
||||
"wg": {
|
||||
@ -123,6 +126,9 @@
|
||||
"microwg": {
|
||||
"title": "MicroWarGear"
|
||||
},
|
||||
"mw": {
|
||||
"title": "MissileWars"
|
||||
},
|
||||
"footer": {
|
||||
"imprint": "Impressum",
|
||||
"privacy": "Datenschutzerklärung",
|
||||
@ -167,7 +173,7 @@
|
||||
"stats": {
|
||||
"playtime": "Spielzeit: {# playtime #}",
|
||||
"fights": "Kämpfe: {# fights #}",
|
||||
"checked": "Schematics Geprüft: {# checked #}"
|
||||
"checked": "Freigegebene Schematics: {# checked #}"
|
||||
},
|
||||
"schematic": {
|
||||
"upload": "Hochladen",
|
||||
@ -194,7 +200,12 @@
|
||||
}
|
||||
},
|
||||
"cancel": "Abbrechen",
|
||||
"title": "Schematic hochladen"
|
||||
"title": "Schematic hochladen",
|
||||
"errors": {
|
||||
"invalidEnding": "Diese Dateiendung kann nicht Hochgeladen werden.",
|
||||
"noFile": "Keine Datei.",
|
||||
"upload": "Fehler beim Hochladen, Überprüfe deine Schematic!"
|
||||
}
|
||||
}
|
||||
},
|
||||
"login": {
|
||||
|
||||
@ -111,7 +111,7 @@
|
||||
"stats": {
|
||||
"playtime": "Playtime: {# playtime #}",
|
||||
"fights": "Fights: {# fights #}",
|
||||
"checked": "Schematics Checked: {# checked #}"
|
||||
"checked": "Accepted Schematics: {# checked #}"
|
||||
},
|
||||
"schematic": {
|
||||
"upload": "Upload",
|
||||
@ -137,6 +137,11 @@
|
||||
"download": "Download",
|
||||
"close": "Close"
|
||||
}
|
||||
},
|
||||
"errors": {
|
||||
"invalidEnding": "This file extension cannot be uploaded.",
|
||||
"noFile": "No file.",
|
||||
"upload": "Error uploading, check your schematic!"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
BIN
src/images/sw-arcade-image.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
@ -1,24 +1,24 @@
|
||||
---
|
||||
import "$lib/styles/app.css";
|
||||
import icon from "../images/logo.png";
|
||||
import {getImage} from "astro:assets";
|
||||
import { astroI18n } from "astro-i18n";
|
||||
import { SEO } from "astro-seo";
|
||||
import { ClientRouter } from "astro:transitions";
|
||||
const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
|
||||
import "../../public/fonts/roboto/roboto.css";
|
||||
|
||||
const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png", quality: 100});
|
||||
---
|
||||
|
||||
<html lang={astroI18n.locale} class="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<meta name="icbm" content="52.370216;4.895168" />
|
||||
<link rel="icon" type="imgage/png" href={iconImage.src}/>
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<meta name="apple-mobile-web-app-title" content="MyWebSite" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
|
||||
<SEO
|
||||
title={title}
|
||||
|
||||
@ -77,7 +77,7 @@ const ogImage = await getImage({
|
||||
)}
|
||||
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}>
|
||||
<h1 class="text-4xl mb-0" transition:name={post.data.title + "-title"}>{post.data.title}</h1>
|
||||
<div class="flex items-center mt-2 text-neutral-300">
|
||||
<div class="flex items-center mt-2 text-neutral-800 dark:text-neutral-300">
|
||||
<TagSolid class="w-4 h-4 mr-2"/>
|
||||
<div transition:name={post.data.title + "-tags"}>
|
||||
{post.data.tags.map(tag => (
|
||||
|
||||
@ -15,7 +15,7 @@ import {type Player} from "../components/types/data";
|
||||
import PostComponent from "../components/PostComponent.astro";
|
||||
import BackgroundImage from "../components/BackgroundImage.astro";
|
||||
|
||||
const teamMember: { [key: string]: Player[]} = await fetch("http://127.0.0.1:1337/data/team")
|
||||
const teamMember: { [key: string]: Player[]} = await fetch(import.meta.env.PUBLIC_API_SERVER + "/data/team")
|
||||
.then(value => value.json());
|
||||
|
||||
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);
|
||||
|
||||
@ -44,4 +44,5 @@ const modes = await getCollection("modes", entry => entry.data.main);
|
||||
</div>
|
||||
</div>
|
||||
</div>))}
|
||||
<a href={l("/rangliste/MissileWars")}>MissileWars Rangliste</a>
|
||||
</PageLayout>
|
||||
@ -31,7 +31,7 @@ table {
|
||||
text-align: center;
|
||||
|
||||
tr:nth-child(odd) {
|
||||
@apply bg-neutral-800;
|
||||
@apply bg-neutral-200 dark:bg-neutral-800;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||