Fix Merge
Some checks failed
SteamWarCI Build failed

This commit is contained in:
2025-04-14 18:15:05 +02:00
31 changed files with 241 additions and 143 deletions

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
public/favicon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

3
public/favicon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 406 KiB

21
public/site.webmanifest Normal file
View 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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -20,6 +20,7 @@
<script lang="ts"> <script lang="ts">
import {t} from "astro-i18n"; import {t} from "astro-i18n";
import {statsRepo} from "@repo/stats.ts"; import {statsRepo} from "@repo/stats.ts";
import "@styles/table.css"
interface Props { interface Props {
@@ -64,7 +65,3 @@
<p>{error.message}</p> <p>{error.message}</p>
{/await} {/await}
<style>
@import "../styles/table.css";
</style>

View File

@@ -79,6 +79,8 @@
}) })
}, },
options: { options: {
maintainAspectRatio: false,
scales: { scales: {
x: { x: {
type: "time", type: "time",
@@ -105,5 +107,5 @@
</script> </script>
<div> <div>
<canvas bind:this={canvas}></canvas> <canvas height="500" bind:this={canvas}></canvas>
</div> </div>

View File

@@ -101,6 +101,8 @@
<a href={l("/rules/microwargear")} <a href={l("/rules/microwargear")}
class="btn btn-gray">{t("navbar.links.rules.micro")}</a> 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> <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>
</div> </div>
<!-- TODO: Add help center <!-- TODO: Add help center

View File

@@ -43,7 +43,5 @@
maximumFractionDigits: 2 maximumFractionDigits: 2
}).format(data.playtime)})}h</p> }).format(data.playtime)})}h</p>
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p> <p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
{#if user.perms.includes("CHECK")}
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p> <p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
{/if}
{/await} {/await}

View File

@@ -21,7 +21,7 @@
import {createEventDispatcher} from "svelte"; import {createEventDispatcher} from "svelte";
import {schemRepo} from "@repo/schem.ts"; import {schemRepo} from "@repo/schem.ts";
import SWModal from "@components/styled/SWModal.svelte"; import SWModal from "@components/styled/SWModal.svelte";
import {t} from "astro-i18n" import {t} from "astro-i18n";
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@@ -29,11 +29,13 @@
open?: boolean; open?: boolean;
} }
let { open = $bindable(false) }: Props = $props(); let {open = $bindable(false)}: Props = $props();
async function upload() { async function upload(e: Event) {
e.stopPropagation();
if (uploadFile == null) { if (uploadFile == null) {
return error = "dashboard.schematic.errors.noFile";
return;
} }
let file = uploadFile[0]; let file = uploadFile[0];
@@ -42,33 +44,46 @@
let type = name.split(".").pop(); let type = name.split(".").pop();
if (type !== "schem" && type !== "schematic") { if (type !== "schem" && type !== "schematic") {
return error = "dashboard.schematic.errors.invalidEnding";
return;
} }
let content = await file.arrayBuffer(); let content = await file.arrayBuffer();
// @ts-ignore
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content))); 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; open = false;
value = ""; 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 uploadFile: FileList | null = $state(null);
let value = $state(""); let value = $state("");
let error = $state(null)
</script> </script>
<SWModal title={t("dashboard.schematic.title")} bind:open> <SWModal title={t("dashboard.schematic.title")} bind:open>
<form> <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> </form>
{#snippet footer()} {#snippet footer()}
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
<button class="btn !ml-auto" onclick={upload}>{t("dashboard.schematic.upload")}</button> <button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
<button class="btn btn-gray" onclick={() => open = false}>{t("dashboard.schematic.cancel")}</button>
{/snippet} {/snippet}
</SWModal> </SWModal>

View File

@@ -68,16 +68,18 @@
}) })
</script> </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"> <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"> <div onclick={stopPropagation(onclick)} aria-hidden="true" class="w-fit">
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700"> <div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
<h1 class="text-4xl font-bold">{title}</h1> <h1 class="text-4xl font-bold">{title}</h1>
</div> </div>
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700"> <div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
{@render children?.()} {@render children?.()}
</div> </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?.()} {@render footer?.()}
</div> </div>
</div> </div>
</div>
</dialog> </dialog>

View File

@@ -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** - Design-Regel: **Weihnachtliches/Winterliches Design**
## Regeln: ## Regeln:
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt - 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 - **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 - 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) - Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG Designcontest)
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung - 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!** **Wir wünschen allen teilnehmenden Teams viel Erfolg!**

View 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!**

View File

@@ -14,13 +14,12 @@ tags:
| Platzierung | Team | Punkte | | Platzierung | Team | Punkte |
|-------------|-------------|--------| |-------------|-------------|--------|
| 1. | ABYSS | 0 | | 1. | Halcyon | 10 |
| | BlackFire | 0 | | 2. | Happy-End | 8 |
| | Borg | 0 | | 3. | ABYSS | 5 |
| | Halcyon | 0 | | 4. | Borg | 4 |
| | Happy-End | 0 | | 5. | BlackFire | 2 |
| | Pulse | 0 | | 6. | TheNoobTeam | 1 |
| | TheNoobTeam | 0 |
### Aktueller Spieltag ### Aktueller Spieltag
@@ -30,42 +29,44 @@ tags:
| 01.03.2025 | Begegnung | Ergebnis | | 01.03.2025 | Begegnung | Ergebnis |
|------------|--------------|----------| |------------|--------------|----------|
| 19:00 | HPY vs ABYS | / | | 19:00 | HPY vs ABYS | HPY qualifiziert |
| 19:30 | Borg vs Hlcy | / | | 19:30 | Borg vs Hlcy | Hlcy qualifiziert |
| 20:00 | TNT vs BF | / | | 20:00 | TNT vs BF | TNT qualifiziert |
| 20:30 | ? vs ? | / | | 20:30 | ABYS vs Borg | Sieg ABYS |
| 21:00 | ? vs ? | / | | 21:00 | Borg vs BF | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | BF vs ABYS | ABYS, Borg qualifiziert |
PL hat sich nach der Qualifikation zurückgezogen, womit BF nachgerückt ist.
### 1. Spieltag ### 1. Spieltag
| 08.03.2025 | Begegnung | Ergebnis | | 08.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | ABYS vs Borg | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | Hlcy vs HPY | Sieg Hlcy |
| 20:00 | ? vs ? | / | | 20:00 | BF vs TNT | Sieg TNT |
| 20:30 | ? vs ? | / | | 20:30 | HPY vs ABYS | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | Borg vs BF | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | TNT vs Hlcy | Sieg Hlcy |
### 2. Spieltag ### 2. Spieltag
| 15.03.2025 | Begegnung | Ergebnis | | 15.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | HPY vs TNT | Sieg HPY |
| 19:30 | ? vs ? | / | | 19:30 | ABYS vs BF | Sieg ABYS |
| 20:00 | ? vs ? | / | | 20:00 | Borg vs Hlcy | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | BF vs HPY | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | TNT vs Borg | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | Hlcy vs ABYS | Sieg Hlcy |
### 3. Spieltag ### 3. Spieltag
| 22.03.2025 | Begegnung | Ergebnis | | 22.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|-------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | ABYS vs TNT | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | Borg vs HPY | Sieg HPY |
| 20:00 | ? vs ? | / | | 20:00 | Hlcy vs BF | Sieg Hlcy |
| 20:30 | - | / | | 20:30 | - | / |
| 21:00 | - | / | | 21:00 | - | / |
| 21:30 | - | / | | 21:30 | - | / |
@@ -73,32 +74,32 @@ tags:
### 4. Spieltag ### 4. Spieltag
| 29.03.2025 | Begegnung | Ergebnis | | 29.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | TNT vs ABYS | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | HPY vs Borg | Sieg HPY |
| 20:00 | ? vs ? | / | | 20:00 | BF vs Hlcy | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | Borg vs TNT | Sieg Borg |
| 21:00 | ? vs ? | / | | 21:00 | HPY vs BF | Sieg HPY |
| 21:30 | ? vs ? | / | | 21:30 | ABYS vs Hlcy | Sieg Hlcy |
### 5. Spieltag ### 5. Spieltag
| 05.04.2025 | Begegnung | Ergebnis | | 05.04.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | TNT vs HPY | Sieg HPY |
| 19:30 | ? vs ? | / | | 19:30 | BF vs ABYS | Sieg BF |
| 20:00 | ? vs ? | / | | 20:00 | Hlcy vs Borg | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | ABYS vs HPY | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | BF vs Borg | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | Hlcy vs TNT | Sieg Hlcy |
### 6. Spieltag ### 6. Spieltag
| 12.04.2025 | Begegnung | Ergebnis | | 12.04.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | Borg vs ABYS | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | HPY vs Hlcy | Sieg Hlcy |
| 20:00 | ? vs ? | / | | 20:00 | TNT vs BF | Sieg BF |
| 20:30 | - | / | | 20:30 | - | / |
| 21:00 | - | / | | 21:00 | - | / |
| 21:30 | - | / | | 21:30 | - | / |

View File

@@ -4,7 +4,8 @@
"url": { "url": {
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar", "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.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" "sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
} }

View File

@@ -2,7 +2,8 @@
"name": "SteamWarTeamserver", "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.", "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": { "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"
} }

View File

@@ -1,4 +1,5 @@
{ {
"translationKey": "microwg", "translationKey": "microwg",
"main": false "main": false,
"ranked": true
} }

View File

@@ -0,0 +1,5 @@
{
"translationKey": "mw",
"main": false,
"ranked": true
}

View File

@@ -1,9 +1,9 @@
{ {
"name": "Graf Spree", "name": "Graf Spee",
"description": "A simple, lightweight description of a frostbite.", "description": "A simple, lightweight description of a frostbite.",
"id": 123, "id": 123,
"creator": ["Test", "Test2"], "creator": ["Test", "Test2"],
"gamemode": "warship", "gamemode": "warship",
"image": "../../../images/publics/grafspree/area_render.png", "image": "../../../images/publics/grafspee/area_render.png",
"3d": false "3d": false
} }

View File

@@ -0,0 +1,3 @@
---
translationKey: mw
---

View File

@@ -87,7 +87,10 @@
"title": "Hilfe", "title": "Hilfe",
"docs": "Dokumentation" "docs": "Dokumentation"
}, },
"account": "Konto" "account": "Konto",
"ranked": {
"mw": "MissileWars"
}
} }
}, },
"wg": { "wg": {
@@ -123,6 +126,9 @@
"microwg": { "microwg": {
"title": "MicroWarGear" "title": "MicroWarGear"
}, },
"mw": {
"title": "MissileWars"
},
"footer": { "footer": {
"imprint": "Impressum", "imprint": "Impressum",
"privacy": "Datenschutzerklärung", "privacy": "Datenschutzerklärung",
@@ -167,7 +173,7 @@
"stats": { "stats": {
"playtime": "Spielzeit: {# playtime #}", "playtime": "Spielzeit: {# playtime #}",
"fights": "Kämpfe: {# fights #}", "fights": "Kämpfe: {# fights #}",
"checked": "Schematics Geprüft: {# checked #}" "checked": "Freigegebene Schematics: {# checked #}"
}, },
"schematic": { "schematic": {
"upload": "Hochladen", "upload": "Hochladen",
@@ -194,7 +200,12 @@
} }
}, },
"cancel": "Abbrechen", "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": { "login": {

View File

@@ -111,7 +111,7 @@
"stats": { "stats": {
"playtime": "Playtime: {# playtime #}", "playtime": "Playtime: {# playtime #}",
"fights": "Fights: {# fights #}", "fights": "Fights: {# fights #}",
"checked": "Schematics Checked: {# checked #}" "checked": "Accepted Schematics: {# checked #}"
}, },
"schematic": { "schematic": {
"upload": "Upload", "upload": "Upload",
@@ -137,6 +137,11 @@
"download": "Download", "download": "Download",
"close": "Close" "close": "Close"
} }
},
"errors": {
"invalidEnding": "This file extension cannot be uploaded.",
"noFile": "No file.",
"upload": "Error uploading, check your schematic!"
} }
} }
}, },

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@@ -1,24 +1,24 @@
--- ---
import "$lib/styles/app.css"; import "$lib/styles/app.css";
import icon from "../images/logo.png"; import { astroI18n } from "astro-i18n";
import {getImage} from "astro:assets"; import { SEO } from "astro-seo";
import {astroI18n} from "astro-i18n"; import { ClientRouter } from "astro:transitions";
import {SEO} from "astro-seo"; const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
import {ClientRouter} from "astro:transitions";
const {title, description, clientSideRouter = true} = Astro.props.frontmatter || Astro.props;
import "../../public/fonts/roboto/roboto.css"; 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"> <html lang={astroI18n.locale} class="dark">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta name="viewport" <meta name="viewport" content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" />
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 http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="icbm" content="52.370216;4.895168" />
<meta name="icbm" content="52.370216;4.895168"/> <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="imgage/png" href={iconImage.src}/> <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 <SEO
title={title} title={title}
@@ -33,17 +33,17 @@ const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png
/> />
<script is:inline data-astro-rerun> <script is:inline data-astro-rerun>
if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) { if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) {
document.documentElement.classList.remove("dark"); document.documentElement.classList.remove("dark");
} }
</script> </script>
<slot name="head"/> <slot name="head" />
{clientSideRouter && <ClientRouter/>} {clientSideRouter && <ClientRouter />}
</head> </head>
<body class="dark:bg-zinc-800"> <body class="dark:bg-zinc-800">
<slot/> <slot />
</body> </body>
</html> </html>

View File

@@ -77,7 +77,7 @@ const ogImage = await getImage({
)} )}
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}> <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> <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"/> <TagSolid class="w-4 h-4 mr-2"/>
<div transition:name={post.data.title + "-tags"}> <div transition:name={post.data.title + "-tags"}>
{post.data.tags.map(tag => ( {post.data.tags.map(tag => (

View File

@@ -15,7 +15,7 @@ import {type Player} from "../components/types/data";
import PostComponent from "../components/PostComponent.astro"; import PostComponent from "../components/PostComponent.astro";
import BackgroundImage from "../components/BackgroundImage.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()); .then(value => value.json());
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale); const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);

View File

@@ -44,4 +44,5 @@ const modes = await getCollection("modes", entry => entry.data.main);
</div> </div>
</div> </div>
</div>))} </div>))}
<a href={l("/rangliste/MissileWars")}>MissileWars Rangliste</a>
</PageLayout> </PageLayout>

View File

@@ -31,7 +31,7 @@ table {
text-align: center; text-align: center;
tr:nth-child(odd) { tr:nth-child(odd) {
@apply bg-neutral-800; @apply bg-neutral-200 dark:bg-neutral-800;
} }
} }
} }