Compare commits
27 Commits
add-tutori
...
a75b5b7c09
| Author | SHA1 | Date | |
|---|---|---|---|
| a75b5b7c09 | |||
| 9146f65455 | |||
| 254807efa6 | |||
| 36931aabb1 | |||
| 628599f019 | |||
| 0a6c61bd88 | |||
| 8bbad8b3cc | |||
| 5af6176889 | |||
| 9250dd5088 | |||
| 276e19409d | |||
| 11fa9fa126 | |||
| 17ec6023a9 | |||
| 3c7c899868 | |||
| 9cb161e470 | |||
| 7fc7c2a6eb | |||
| 2fce94d46b | |||
| 6356c9911a | |||
| 2402896fd5 | |||
| 2940304492 | |||
| 4c0a237b27 | |||
| 77b8b41afb | |||
| 163d049829 | |||
| a321b12680 | |||
| feba5a5b4a | |||
| faaf5f1852 | |||
| 18997e1384 | |||
| fdc7bb93dd |
@@ -5,7 +5,6 @@ import configureI18n from "./astro-i18n.adapter";
|
|||||||
import sitemap from "@astrojs/sitemap";
|
import sitemap from "@astrojs/sitemap";
|
||||||
|
|
||||||
import robotsTxt from "astro-robots-txt";
|
import robotsTxt from "astro-robots-txt";
|
||||||
import {resolve} from "node:url";
|
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import mdx from "@astrojs/mdx";
|
import mdx from "@astrojs/mdx";
|
||||||
import pagefind from "astro-pagefind";
|
import pagefind from "astro-pagefind";
|
||||||
|
|||||||
11
package.json
11
package.json
@@ -14,11 +14,11 @@
|
|||||||
"i18n:sync": "pnpm run i18n:generate:pages && pnpm run i18n:generate:types",
|
"i18n:sync": "pnpm run i18n:generate:pages && pnpm run i18n:generate:types",
|
||||||
"clean:dist": "rm -rf dist",
|
"clean:dist": "rm -rf dist",
|
||||||
"clean:node_modules": "rm -rf node_modules",
|
"clean:node_modules": "rm -rf node_modules",
|
||||||
"ci": "pnpm run clean:dist && pnpm install && pnpm run i18n:sync && pnpm run build"
|
"ci": "pnpm install && pnpm run i18n:sync && pnpm run build"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@astrojs/svelte": "^6.0.2",
|
"@astrojs/svelte": "^7.0.4",
|
||||||
"@astrojs/tailwind": "^5.1.2",
|
"@astrojs/tailwind": "^5.1.5",
|
||||||
"@astropub/icons": "^0.2.0",
|
"@astropub/icons": "^0.2.0",
|
||||||
"@types/color": "^4.2.0",
|
"@types/color": "^4.2.0",
|
||||||
"@types/node": "^22.9.3",
|
"@types/node": "^22.9.3",
|
||||||
@@ -41,11 +41,12 @@
|
|||||||
"typescript": "^5.7.2"
|
"typescript": "^5.7.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/mdx": "^3.1.9",
|
"@astrojs/mdx": "^4.0.7",
|
||||||
"@astrojs/sitemap": "^3.2.1",
|
"@astrojs/sitemap": "^3.2.1",
|
||||||
|
"@codemirror/commands": "^6.8.0",
|
||||||
"@codemirror/lang-json": "^6.0.1",
|
"@codemirror/lang-json": "^6.0.1",
|
||||||
"@ddietr/codemirror-themes": "^1.4.4",
|
"@ddietr/codemirror-themes": "^1.4.4",
|
||||||
"astro": "^4.16.14",
|
"astro": "^5.1.8",
|
||||||
"astro-i18n": "^2.2.4",
|
"astro-i18n": "^2.2.4",
|
||||||
"astro-pagefind": "^1.6.0",
|
"astro-pagefind": "^1.6.0",
|
||||||
"astro-robots-txt": "^1.0.0",
|
"astro-robots-txt": "^1.0.0",
|
||||||
|
|||||||
9324
pnpm-lock.yaml
generated
9324
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -75,9 +75,7 @@
|
|||||||
|
|
||||||
<style lang="postcss">
|
<style lang="postcss">
|
||||||
input {
|
input {
|
||||||
@apply border-2 rounded-md p-2 shadow-2xl w-80
|
@apply border-2 rounded-md p-2 shadow-2xl w-80 dark:bg-neutral-800 focus:outline-none focus:ring-2 focus:ring-neutral-500 focus:border-transparent text-black;
|
||||||
dark:bg-neutral-800
|
|
||||||
focus:outline-none focus:ring-2 focus:ring-neutral-500 focus:border-transparent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
label {
|
label {
|
||||||
|
|||||||
@@ -18,133 +18,81 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import "../styles/button.css";
|
import "../styles/button.css";
|
||||||
import { CaretDownOutline, SearchOutline } from "flowbite-svelte-icons";
|
import {CaretDownOutline, SearchOutline} from "flowbite-svelte-icons";
|
||||||
import { t } from "astro-i18n";
|
import {t} from "astro-i18n";
|
||||||
import { l } from "../util/util";
|
import {l} from "../util/util";
|
||||||
import { onMount } from "svelte";
|
import {onMount} from "svelte";
|
||||||
import { loggedIn } from "@repo/authv2.ts";
|
|
||||||
interface Props {
|
interface Props {
|
||||||
logo?: import("svelte").Snippet;
|
logo?: import('svelte').Snippet;
|
||||||
}
|
}
|
||||||
|
|
||||||
let { logo }: Props = $props();
|
let { logo }: Props = $props();
|
||||||
|
|
||||||
let navbar = $state<HTMLDivElement>();
|
let navbar: HTMLDivElement = $state();
|
||||||
let searchOpen = $state(false);
|
let searchOpen = $state(false);
|
||||||
|
|
||||||
let accountBtn = $state<HTMLAnchorElement>();
|
onMount(() => {
|
||||||
|
handleScroll();
|
||||||
|
})
|
||||||
|
|
||||||
$effect(() => {
|
function handleScroll() {
|
||||||
if ($loggedIn) {
|
if (window.scrollY > 0) {
|
||||||
accountBtn!.href = l("/dashboard");
|
navbar.classList.add("before:scale-y-100");
|
||||||
} else {
|
} else {
|
||||||
accountBtn!.href = l("/login");
|
navbar.classList.remove("before:scale-y-100");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
handleScroll();
|
|
||||||
});
|
|
||||||
|
|
||||||
function handleScroll() {
|
|
||||||
if (window.scrollY > 0) {
|
|
||||||
navbar!.classList.add("before:scale-y-100");
|
|
||||||
} else {
|
|
||||||
navbar!.classList.remove("before:scale-y-100");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window onscroll={handleScroll} />
|
<svelte:window onscroll={handleScroll}/>
|
||||||
|
|
||||||
<nav
|
<nav data-pagefind-ignore class="fixed top-0 left-0 right-0 sm:px-4 py-1 transition-colors z-10 flex justify-center before:backdrop-blur before:shadow-2xl before:absolute before:top-0 before:left-0 before:bottom-0 before:right-0 before:-z-10 before:scale-y-0 before:transition-transform before:origin-top" bind:this={navbar}>
|
||||||
data-pagefind-ignore
|
<div class="flex flex-row items-center justify-evenly md:justify-between match">
|
||||||
class="fixed top-0 left-0 right-0 sm:px-4 py-1 transition-colors z-10 flex justify-center before:backdrop-blur before:shadow-2xl before:absolute before:top-0 before:left-0 before:bottom-0 before:right-0 before:-z-10 before:scale-y-0 before:transition-transform before:origin-top"
|
<a class="flex items-center" href={l("/")}>
|
||||||
bind:this={navbar}
|
{@render logo?.()}
|
||||||
>
|
<span class="text-2xl uppercase font-bold dark:text-white hidden md:inline-block">
|
||||||
<div
|
{t("navbar.title")}
|
||||||
class="flex flex-row items-center justify-evenly md:justify-between match"
|
<span class="before:scale-y-100" style="display: none" aria-hidden="true"></span>
|
||||||
>
|
</span>
|
||||||
<a class="flex items-center" href={l("/")}>
|
</a>
|
||||||
{@render logo?.()}
|
<div class="flex justify-center flex-wrap">
|
||||||
<span
|
<div class="btn-dropdown">
|
||||||
class="text-2xl uppercase font-bold dark:text-white hidden md:inline-block"
|
<button class="btn btn-gray">
|
||||||
>
|
<a href={l("/")}>
|
||||||
{t("navbar.title")}
|
<span class="btn__text">{t("navbar.links.home.title")}</span>
|
||||||
<span
|
</a>
|
||||||
class="before:scale-y-100"
|
<CaretDownOutline class="ml-2 mt-auto"/>
|
||||||
style="display: none"
|
</button>
|
||||||
aria-hidden="true"
|
<div>
|
||||||
></span>
|
<a class="btn btn-gray" href={l("/announcements")}>{t("navbar.links.home.announcements")}</a>
|
||||||
</span>
|
<a class="btn btn-gray" href={l("/downloads")}>{t("navbar.links.home.downloads")}</a>
|
||||||
</a>
|
<a class="btn btn-gray" href={l("/faq")}>{t("navbar.links.home.faq")}</a>
|
||||||
<div class="flex justify-center flex-wrap">
|
<a class="btn btn-gray" href={l("/code-of-conduct")}>{t("navbar.links.rules.coc")}</a>
|
||||||
<div class="btn-dropdown">
|
</div>
|
||||||
<button class="btn btn-gray">
|
</div>
|
||||||
<a href={l("/")}>
|
<div class="btn-dropdown">
|
||||||
<span class="btn__text">{t("navbar.links.home.title")}</span>
|
<button class="btn btn-gray">
|
||||||
</a>
|
<a rel="prefetch" href={l("/rules")}>
|
||||||
<CaretDownOutline class="ml-2 mt-auto" />
|
<span class="btn__text">{t("navbar.links.rules.title")}</span>
|
||||||
</button>
|
</a>
|
||||||
<div>
|
<CaretDownOutline class="ml-2 mt-auto"/>
|
||||||
<a class="btn btn-gray" href={l("/announcements")}
|
</button>
|
||||||
>{t("navbar.links.home.announcements")}</a
|
<div>
|
||||||
>
|
<a href={l("/rules/wargear")} class="btn btn-gray">{t("navbar.links.rules.wg")}</a>
|
||||||
<a class="btn btn-gray" href={l("/downloads")}
|
<a href={l("/rules/miniwargear")} class="btn btn-gray">{t("navbar.links.rules.mwg")}</a>
|
||||||
>{t("navbar.links.home.downloads")}</a
|
<a href={l("/rules/warship")} class="btn btn-gray">{t("navbar.links.rules.ws")}</a>
|
||||||
>
|
<a href={l("/rules/airship")} class="btn btn-gray">{t("navbar.links.rules.as")}</a>
|
||||||
<a class="btn btn-gray" href={l("/tutorials")}
|
<a href={l("/rules/quickgear")} class="btn btn-gray">{t("navbar.links.rules.qg")}</a>
|
||||||
>{t("navbar.links.home.tutorials")}</a
|
<h2 class="px-2 text-gray-300">{t("navbar.links.rules.rotating")}</h2>
|
||||||
>
|
<a href={l("/rules/megawargear")}
|
||||||
<a class="btn btn-gray" href={l("/faq")}
|
class="btn btn-gray">{t("navbar.links.rules.megawg")}</a>
|
||||||
>{t("navbar.links.home.faq")}</a
|
<a href={l("/rules/microwargear")}
|
||||||
>
|
class="btn btn-gray">{t("navbar.links.rules.micro")}</a>
|
||||||
<a class="btn btn-gray" href={l("/code-of-conduct")}
|
<a href={l("/rules/streetfight")} class="btn btn-gray">{t("navbar.links.rules.sf")}</a>
|
||||||
>{t("navbar.links.rules.coc")}</a
|
</div>
|
||||||
>
|
</div>
|
||||||
</div>
|
<!-- TODO: Add help center
|
||||||
</div>
|
|
||||||
<div class="btn-dropdown">
|
|
||||||
<button class="btn btn-gray">
|
|
||||||
<a rel="prefetch" href={l("/rules")}>
|
|
||||||
<span class="btn__text">{t("navbar.links.rules.title")}</span>
|
|
||||||
</a>
|
|
||||||
<CaretDownOutline class="ml-2 mt-auto" />
|
|
||||||
</button>
|
|
||||||
<div>
|
|
||||||
<a href={l("/rules/wargear")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.wg")}</a
|
|
||||||
>
|
|
||||||
<a href={l("/rules/miniwargear")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.mwg")}</a
|
|
||||||
>
|
|
||||||
<a href={l("/rules/warship")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.ws")}</a
|
|
||||||
>
|
|
||||||
<a href={l("/rules/airship")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.as")}</a
|
|
||||||
>
|
|
||||||
<a href={l("/rules/quickgear")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.qg")}</a
|
|
||||||
>
|
|
||||||
<h2 class="px-2 text-gray-300">{t("navbar.links.rules.rotating")}</h2>
|
|
||||||
<a href={l("/rules/megawargear")} class="btn btn-gray"
|
|
||||||
>{t("navbar.links.rules.megawg")}</a
|
|
||||||
>
|
|
||||||
<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
|
|
||||||
<div class="btn-dropdown my-1">
|
<div class="btn-dropdown my-1">
|
||||||
<div class="btn btn-gray" tabindex="1">
|
<div class="btn btn-gray" tabindex="1">
|
||||||
<a rel="prefetch">
|
<a rel="prefetch">
|
||||||
@@ -158,26 +106,26 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
<a class="btn" href={l("/login")} bind:this={accountBtn}>
|
<a class="btn" href={l("/login")}>
|
||||||
<span class="btn__text">{t("navbar.links.account")}</span>
|
<span class="btn__text">{t("navbar.links.account")}</span>
|
||||||
</a>
|
</a>
|
||||||
<!--
|
<!--
|
||||||
<button class="btn my-1" onclick={() => searchOpen = true}>
|
<button class="btn my-1" onclick={() => searchOpen = true}>
|
||||||
<SearchOutline ariaLabel="Site Search" class="inline-block h-6"/>
|
<SearchOutline ariaLabel="Site Search" class="inline-block h-6"/>
|
||||||
</button>
|
</button>
|
||||||
-->
|
-->
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{#if searchOpen}
|
{#if searchOpen}
|
||||||
{#await import("./SearchComponent.svelte") then c}
|
{#await import("./SearchComponent.svelte") then c}
|
||||||
<c.default bind:open={searchOpen} />
|
<c.default bind:open={searchOpen} />
|
||||||
{/await}
|
{/await}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.match {
|
.match {
|
||||||
width: min(100vw, 70em);
|
width: min(100vw, 70em);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -168,11 +168,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{#if selectedBranch !== "master"}
|
{#if selectedBranch !== "master"}
|
||||||
<Button onclick={createFile} color="alternative" disabled={!selectedPath}>Create File
|
<Button onclick={() => createFile()} color="alternative" disabled={!selectedPath}>Create File
|
||||||
</Button>
|
</Button>
|
||||||
<Button onclick={() => deleteBranch(false)} color="none">Delete Branch</Button>
|
<Button onclick={() => deleteBranch(false)} color="none">Delete Branch</Button>
|
||||||
{:else}
|
{:else}
|
||||||
<Button onclick={createBranch}>Create Branch</Button>
|
<Button onclick={() => createBranch()}>Create Branch</Button>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
let request = getRequest();
|
let request = getRequest();
|
||||||
|
|
||||||
function getRequest() {
|
function getRequest() {
|
||||||
return $statsRepo.getUserStats(user.id)
|
return $statsRepo.getUserStats(user.uuid)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -46,5 +46,4 @@
|
|||||||
{#if user.perms.includes("CHECK")}
|
{#if user.perms.includes("CHECK")}
|
||||||
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
||||||
{/if}
|
{/if}
|
||||||
{:catch error}
|
|
||||||
{/await}
|
{/await}
|
||||||
@@ -50,19 +50,20 @@
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
||||||
|
|
||||||
await $schemRepo.uploadSchematic(name, b64);
|
let response = await $schemRepo.uploadSchematic(name, b64);
|
||||||
|
|
||||||
open = false;
|
open = false;
|
||||||
uploadFile = null;
|
value = "";
|
||||||
dispatch("reset")
|
dispatch("reset")
|
||||||
}
|
}
|
||||||
|
|
||||||
let uploadFile: FileList | null = $state(null);
|
let uploadFile: FileList | null = $state(null);
|
||||||
|
let value = $state("");
|
||||||
</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} />
|
<input type="file" bind:files={uploadFile} bind:value />
|
||||||
</form>
|
</form>
|
||||||
{#snippet footer()}
|
{#snippet footer()}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h1 class="text-4xl font-bold">{t("dashboard.title", {name: user.name})}</h1>
|
<h1 class="text-4xl font-bold">{t("dashboard.title", {name: user.name})}</h1>
|
||||||
<p>{t("dashboard.rank", {rank: t("home.prefix." + user.prefix)})}</p>
|
<p>{t("dashboard.rank", {rank: t("home.prefix." + (user.prefix || "User"))})}</p>
|
||||||
<Statistics {user} />
|
<Statistics {user} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
||||||
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
||||||
import {onDestroy, onMount} from "svelte";
|
import {onDestroy, onMount} from "svelte";
|
||||||
import { CollectionEntry } from "astro:content";
|
import type { CollectionEntry } from "astro:content";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
pub: CollectionEntry<"publics">;
|
pub: CollectionEntry<"publics">;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
import {fetchWithToken, tokenStore} from "./repo.ts";
|
import {fetchWithToken, tokenStore} from "./repo.ts";
|
||||||
import {type Schematic, SchematicSchema} from "@type/schem.ts";
|
import {type Schematic, SchematicSchema} from "@type/schem.ts";
|
||||||
import {derived} from "svelte/store";
|
import {derived} from "svelte/store";
|
||||||
|
import {ResponseErrorSchema} from "@type/data.ts";
|
||||||
|
|
||||||
export class SchematicRepo {
|
export class SchematicRepo {
|
||||||
constructor(private token: string) {
|
constructor(private token: string) {
|
||||||
@@ -40,7 +41,7 @@ export class SchematicRepo {
|
|||||||
name,
|
name,
|
||||||
content,
|
content,
|
||||||
}),
|
}),
|
||||||
});
|
}).then(value => value.json()).then(SchematicSchema.or(ResponseErrorSchema).parse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,3 +50,10 @@ export const ServerSchema = z.object({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export type Server = z.infer<typeof ServerSchema>;
|
export type Server = z.infer<typeof ServerSchema>;
|
||||||
|
|
||||||
|
export const ResponseErrorSchema = z.object({
|
||||||
|
error: z.string(),
|
||||||
|
code: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type ResponseError = z.infer<typeof ResponseErrorSchema>;
|
||||||
|
|||||||
22
src/content/announcements/de/eventplan-2025.md
Normal file
22
src/content/announcements/de/eventplan-2025.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: Eventplan 2025
|
||||||
|
key: eventplan-2025
|
||||||
|
description: Der Eventplan für das Jahr 2025.
|
||||||
|
created: 2025-01-20
|
||||||
|
tags:
|
||||||
|
- event
|
||||||
|
image: ../../../images/jAHRESPLAN-gro-5.png
|
||||||
|
---
|
||||||
|
|
||||||
|
2025 wird ein Jahr voller spannender Events. Hier findet ihr eine Übersicht über die geplanten Events.
|
||||||
|
|
||||||
|
Highlights sind:
|
||||||
|
- **WargearSeason 2025**
|
||||||
|
- **SteamWar Arcade**
|
||||||
|
- **WarGear mit SFA**
|
||||||
|
- **MiniWarGear Liga**
|
||||||
|
- **SpaceShip**
|
||||||
|
|
||||||
|
aber auch viele mehr.
|
||||||
|
|
||||||
|
Es wird auch kleinere Events geben, die nicht angekündigt sind.
|
||||||
@@ -104,14 +104,6 @@ export const publics = defineCollection({
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const tutorials = defineCollection({
|
|
||||||
type: "content",
|
|
||||||
schema: z.object({
|
|
||||||
title: z.string(),
|
|
||||||
translationKey: z.string(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const collections = {
|
export const collections = {
|
||||||
"pages": pages,
|
"pages": pages,
|
||||||
"help": help,
|
"help": help,
|
||||||
@@ -120,5 +112,4 @@ export const collections = {
|
|||||||
"downloads": downloads,
|
"downloads": downloads,
|
||||||
"announcements": announcements,
|
"announcements": announcements,
|
||||||
"publics": publics,
|
"publics": publics,
|
||||||
"tutorials": tutorials
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
"name": "AdvancedScripts",
|
"name": "AdvancedScripts",
|
||||||
"description": "Ein Fabric-Mod, der für den BauServer von SteamWar Hotkeys für das ScriptSystem hinzufügt. Hierzu werden die einzelnen Zeichen an den Server gesendet und vom Server verarbeitet.",
|
"description": "Ein Fabric-Mod, der für den BauServer von SteamWar Hotkeys für das ScriptSystem hinzufügt. Hierzu werden die einzelnen Zeichen an den Server gesendet und vom Server verarbeitet.",
|
||||||
"url": {
|
"url": {
|
||||||
"1.20.1": "https://steamwar.de/AdvancedScriptsV3",
|
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar",
|
||||||
"1.19": "https://steamwar.de/AdvancedScripts"
|
"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"
|
||||||
},
|
},
|
||||||
"sourceUrl": "https://steamwar.de/devlabs/SteamWar/AdvancedScripts"
|
"sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
|
||||||
}
|
}
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "FabricModSender",
|
|
||||||
"description": "Ein Fabric-Mod, der SteamWar beim Serverjoin die von dir installierten Mods sendet und es uns damit ermöglicht, sie auf schädliche Mods zu überprüfen. Eine Installation dieses Mods ermöglicht dir das Joinen von Arenen mit Fabric auf SteamWar.",
|
|
||||||
"url": "https://steamwar.de/FabricModSender",
|
|
||||||
"sourceUrl": "https://steamwar.de/devlabs/SteamWar/FabricModSender"
|
|
||||||
}
|
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
"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://steamwar.de/SteamWarTeamserver"
|
|
||||||
},
|
},
|
||||||
"sourceUrl": "https://steamwar.de/devlabs/SteamWar/SteamWarBungeeTeamserver"
|
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarBungeeTeamserver"
|
||||||
}
|
}
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
---
|
|
||||||
title: Tracer
|
|
||||||
translationKey: tracer
|
|
||||||
slug: tracer
|
|
||||||
---
|
|
||||||
|
|
||||||
# Der Tracer
|
|
||||||

|
|
||||||
|
|
||||||
Der Tracer ist eines der Kern-Tools unseres BauSystems. Durch ihn kannst du
|
|
||||||
dir komfortabel angucken wie sich die TNT deiner Kanonen Tick für Tick
|
|
||||||
verhalten. Dies tut der Tracer, indem er alle Daten der auf einem Plot
|
|
||||||
gezündeten TNTs aufnimmt und speichert. Du kannst dir dann verschiedene
|
|
||||||
Darstellungsformen der aufgezeichneten TNTs angucken.
|
|
||||||
|
|
||||||
## Den Tracer starten
|
|
||||||
Um die Schüsse deiner Kanone auf einem Plot aufzunehmen, musst du den Tracer
|
|
||||||
für diese Plot einschalten. Nutze hierfür `/trace auto`.
|
|
||||||
Nun da der Tracer an ist, wird für jeden Kanonenschuss ein Trace erstellt.
|
|
||||||
|
|
||||||
## Traces anzeigen und analysieren
|
|
||||||
Jetzt da der Tracer an ist und du einen Schuss abgegeben hast, kannst du dir
|
|
||||||
den Trace mit
|
|
||||||
`/trace show` anzeigen (Falls du mehrere Schüsse abgegeben hast kannst du
|
|
||||||
dir mit
|
|
||||||
`/trace isolate [Schuss-Nummer]` den Trace eines einzelnen Schusses anzeigen).
|
|
||||||
|
|
||||||
|
|
||||||
Zur Analyse eines Schusses stellen wir dir verschiedene **View-Flags** zur
|
|
||||||
Verfügung. Diese aktivierst du, indem du sie an den Trace-show Command
|
|
||||||
anhängst.
|
|
||||||
|
|
||||||
| Flag | Beschreibung |
|
|
||||||
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| `count` | Zeige dir die Zahl der TNTs an die an einem Trace-Punkt aufgenommen wurden |
|
|
||||||
| `explosion` | Zeige dir nur die Trace-Punkte an, an denen TNT explodiert ist |
|
|
||||||
| `fuse` | Zeige dir an wie weit die TNTs an einem Trace Punkt von der Explosion weg waren |
|
|
||||||
| `ignite` | Ohne diese Flag zeigt der Tracer nur Trace-Punkte an, die nach der ersten Explosion entstanden sind. Mit dieser Flag werden alle Trace-Punkte angezeigt |
|
|
||||||
| `micromotion` | Zeige nur TNT an, die sich zu einem beliebigen Zeitpunkt mir einer Geschwindigkeit von kleiner 0.001 bewegt haben |
|
|
||||||
| `source` | Zeige dir nur Trace-Punkte an, bei denen TNT gezündet wurde |
|
|
||||||
| `build-destroy-only` | Zeige dir nur TNT an, die im Bau-Bereich explodiert sind |
|
|
||||||
| `testblock-destroy-only` | Zeige dir nur TNT an, die im Testblock-Bereich explodiert sind |
|
|
||||||
| `advanced` | Zeige dir die TNT-Zwischenberechnungspunkte auf den einzelnen Achsen an |
|
|
||||||
|
|
||||||
\
|
|
||||||
Du kannst dir auch nur einen Abschnitt des Traces mit
|
|
||||||
`\trace show from [Start-Zeit] to [End-Zeit] with [View-Flags]` anzeigen. Du kann auch `from` oder `to` weglassen, um dir den Trace von bzw. bis zu einem gewissen Zeitpunkt angucken.
|
|
||||||
|
|
||||||
## Traces löschen
|
|
||||||
Allgemein empfiehlt es sich Traces nicht ewig rumliegen zu lassen, da ein
|
|
||||||
`/trace show` schnell den PC zum erliegen bringen kann. Nutze `/trace
|
|
||||||
delete [Schuss-Nummer]` um einzelne Traces zu löschen und `/trace clear`
|
|
||||||
um alle Traces auf einem Plot zu löschen.
|
|
||||||
|
|
||||||
## Traces gemeinsam betrachten
|
|
||||||
Wenn man zusammen an einer Kanonen arbeitet kann es praktisch sein, die selben Traces, mit den selben View-Flags zu betrachten. Dies kannst du machen mit `/trace follow [Spieler]`. Den Follow kannst du mit `/trace unfollow` wieder aufheben. Zusätzlich kannst du alle Spieler auf einem Bau-Server mit `/trace broadcast` einladen deiner Trace-View zu folgen.
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Der Tracer
|
|
||||||

|
|
||||||
|
|
||||||
Der Tracer ist eines der Kern-Tools unseres BauSystems. Durch ihn kannst du
|
|
||||||
dir komfortabel angucken wie sich die TNT deiner Kanonen Tick für Tick
|
|
||||||
verhalten. Dies tut der Tracer, indem er alle Daten der auf einem Plot
|
|
||||||
gezündeten TNTs aufnimmt und speichert. Du kannst dir dann verschiedene
|
|
||||||
Darstellungsformen der aufgezeichneten TNTs angucken.
|
|
||||||
|
|
||||||
## Den Tracer starten
|
|
||||||
Um die Schüsse deiner Kanone auf einem Plot aufzunehmen, musst du den Tracer
|
|
||||||
für diese Plot einschalten. Nutze hierfür `/trace auto`.
|
|
||||||
Nun da der Tracer an ist, wird für jeden Kanonenschuss ein Trace erstellt.
|
|
||||||
|
|
||||||
## Traces anzeigen und analysieren
|
|
||||||
Jetzt da der Tracer an ist und du einen Schuss abgegeben hast, kannst du dir
|
|
||||||
den Trace mit
|
|
||||||
`/trace show` anzeigen (Falls du mehrere Schüsse abgegeben hast kannst du
|
|
||||||
dir mit
|
|
||||||
`/trace isolate [Schuss-Nummer]` den Trace eines einzelnen Schusses anzeigen).
|
|
||||||
|
|
||||||
|
|
||||||
Zur Analyse eines Schusses stellen wir dir verschiedene **View-Flags** zur
|
|
||||||
Verfügung. Diese aktivierst du, indem du sie an den Trace-show Command
|
|
||||||
anhängst.
|
|
||||||
|
|
||||||
| Flag | Beschreibung |
|
|
||||||
| - | - |
|
|
||||||
| `count` | Zeige dir die Zahl der TNTs an die an einem Trace-Punkt aufgenommen wurden |
|
|
||||||
| `explosion` | Zeige dir nur die Trace-Punkte an, an denen TNT explodiert ist |
|
|
||||||
| `fuse` | Zeige dir an wie weit die TNTs an einem Trace Punkt von der Explosion weg waren |
|
|
||||||
| `ignite` | Ohne diese Flag zeigt der Tracer nur Trace-Punkte an, die nach der ersten Explosion entstanden sind. Mit dieser Flag werden alle Trace-Punkte angezeigt |
|
|
||||||
| `micromotion` | Zeige nur TNT an, die sich zu einem beliebigen Zeitpunkt mir einer Geschwindigkeit von kleiner 0.001 bewegt haben |
|
|
||||||
| `source` | Zeige dir nur Trace-Punkte an, bei denen TNT gezündet wurde |
|
|
||||||
| `build-destroy-only` | Zeige dir nur TNT an, die im Bau-Bereich explodiert sind |
|
|
||||||
| `testblock-destroy-only` | Zeige dir nur TNT an, die im Testblock-Bereich explodiert sind |
|
|
||||||
| `advanced` | Zeige dir die TNT-Zwischenberechnungspunkte auf den einzelnen Achsen an |
|
|
||||||
|
|
||||||
\
|
|
||||||
Du kannst dir auch nur einen Abschnitt des Traces mit
|
|
||||||
`\trace show from [Start-Zeit] to [End-Zeit] with [View-Flags]` anzeigen. Du kann auch `from` oder `to` weglassen, um dir den Trace von bzw. bis zu einem gewissen Zeitpunkt angucken.
|
|
||||||
|
|
||||||
## Traces löschen
|
|
||||||
Allgemein empfiehlt es sich Traces nicht ewig rumliegen zu lassen, da ein
|
|
||||||
`/trace show` schnell den PC zum erliegen bringen kann. Nutze `/trace
|
|
||||||
delete [Schuss-Nummer]` um einzelne Traces zu löschen und `/trace clear`
|
|
||||||
um alle Traces auf einem Plot zu löschen.
|
|
||||||
|
|
||||||
## Traces gemeinsam betrachten
|
|
||||||
Wenn man zusammen an einer Kanonen arbeitet kann es praktisch sein, die selben Traces, mit den selben View-Flags zu betrachten. Dies kannst du machen mit `/trace follow [Spieler]`. Den Follow kannst du mit `/trace unfollow` wieder aufheben. Zusätzlich kannst du alle Spieler auf einem Bau-Server mit `/trace broadcast` einladen deiner Trace-View zu folgen.
|
|
||||||
@@ -41,7 +41,9 @@
|
|||||||
"Dev": "Developer",
|
"Dev": "Developer",
|
||||||
"Mod": "Moderator",
|
"Mod": "Moderator",
|
||||||
"Sup": "Supporter",
|
"Sup": "Supporter",
|
||||||
"Arch": "Architekt"
|
"Arch": "Architekt",
|
||||||
|
"User": "Spieler",
|
||||||
|
"YT": "YouTuber"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
@@ -63,7 +65,6 @@
|
|||||||
"announcements": "Ankündigungen",
|
"announcements": "Ankündigungen",
|
||||||
"about": "Über Uns",
|
"about": "Über Uns",
|
||||||
"downloads": "Downloads",
|
"downloads": "Downloads",
|
||||||
"tutorials": "Tutorials",
|
|
||||||
"faq": "FAQ"
|
"faq": "FAQ"
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -241,5 +242,9 @@
|
|||||||
},
|
},
|
||||||
"ranking": {
|
"ranking": {
|
||||||
"heading": "{# mode #} Rangliste"
|
"heading": "{# mode #} Rangliste"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"title": "404 - Seite nicht gefunden",
|
||||||
|
"description": "Seite nicht gefunden"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
"announcements": "Announcements",
|
"announcements": "Announcements",
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"downloads": "Downloads",
|
"downloads": "Downloads",
|
||||||
"tutorials": "Tutorials",
|
|
||||||
"faq": "FAQ"
|
"faq": "FAQ"
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -63,7 +62,9 @@
|
|||||||
"Dev": "Developer",
|
"Dev": "Developer",
|
||||||
"Mod": "Moderator",
|
"Mod": "Moderator",
|
||||||
"Sup": "Supporter",
|
"Sup": "Supporter",
|
||||||
"Arch": "Builder"
|
"Arch": "Builder",
|
||||||
|
"User": "User",
|
||||||
|
"YT": "YouTuber"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
@@ -181,5 +182,9 @@
|
|||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"title": "Fight Statistics"
|
"title": "Fight Statistics"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"title": "404 - Page not found",
|
||||||
|
"description": "Page not found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
src/images/jAHRESPLAN-gro-4.png
Normal file
BIN
src/images/jAHRESPLAN-gro-4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
BIN
src/images/jAHRESPLAN-gro-5.png
Normal file
BIN
src/images/jAHRESPLAN-gro-5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.0 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.0 MiB |
@@ -3,9 +3,8 @@ import icon from "../images/logo.png";
|
|||||||
import {getImage} from "astro:assets";
|
import {getImage} from "astro:assets";
|
||||||
import {astroI18n} from "astro-i18n";
|
import {astroI18n} from "astro-i18n";
|
||||||
import {SEO} from "astro-seo";
|
import {SEO} from "astro-seo";
|
||||||
import {ViewTransitions} from "astro:transitions";
|
import {ClientRouter} from "astro:transitions";
|
||||||
const {title, description, clientSideRouter = true} = Astro.props.frontmatter || Astro.props;
|
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});
|
const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png", quality: 100});
|
||||||
@@ -40,7 +39,7 @@ if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) &
|
|||||||
|
|
||||||
<slot name="head"/>
|
<slot name="head"/>
|
||||||
|
|
||||||
{clientSideRouter && <ViewTransitions/>}
|
{clientSideRouter && <ClientRouter/>}
|
||||||
</head>
|
</head>
|
||||||
<body class="dark:bg-zinc-800">
|
<body class="dark:bg-zinc-800">
|
||||||
<slot/>
|
<slot/>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const {title, description} = Astro.props;
|
|||||||
<div class="h-screen w-screen fixed -z-10">
|
<div class="h-screen w-screen fixed -z-10">
|
||||||
<BackgroundImage />
|
<BackgroundImage />
|
||||||
</div>
|
</div>
|
||||||
<div class="mx-auto bg-gray-100 p-8 rounded-b-md shadow-md pt-40 sm:pt-28 md:pt-14 relative
|
<div class="mx-auto bg-gray-100 p-8 rounded-b-md shadow-md pt-14 relative
|
||||||
dark:text-white dark:bg-neutral-900" style="width: min(100%, 75em);">
|
dark:text-white dark:bg-neutral-900" style="width: min(100%, 75em);">
|
||||||
<slot/>
|
<slot/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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("https://api.steamwar.de/data/team")
|
const teamMember: { [key: string]: Player[]} = await fetch("http://127.0.0.1:1337/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);
|
||||||
|
|||||||
39
src/pages/not-found.astro
Normal file
39
src/pages/not-found.astro
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
import PageLayout from "../layouts/PageLayout.astro";
|
||||||
|
import {t} from "astro-i18n";
|
||||||
|
---
|
||||||
|
|
||||||
|
<PageLayout title={t("404.title")}>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400">
|
||||||
|
<!-- 404 Text - heller für besseren Kontrast -->
|
||||||
|
<text x="400" y="150" font-family="Arial Black" font-size="120" fill="#ffffff" text-anchor="middle">404</text>
|
||||||
|
|
||||||
|
<!-- Trauriger Roboter - hellere Farben für besseren Kontrast -->
|
||||||
|
<!-- Körper -->
|
||||||
|
<rect x="350" y="200" width="100" height="120" rx="10" fill="#888888"/>
|
||||||
|
|
||||||
|
<!-- Kopf -->
|
||||||
|
<rect x="365" y="160" width="70" height="60" rx="5" fill="#888888"/>
|
||||||
|
|
||||||
|
<!-- Augen -->
|
||||||
|
<circle cx="385" cy="185" r="8" fill="#ff6b6b"/>
|
||||||
|
<circle cx="415" cy="185" r="8" fill="#ff6b6b"/>
|
||||||
|
|
||||||
|
<!-- Antenne -->
|
||||||
|
<line x1="400" y1="160" x2="400" y2="140" stroke="#888888" stroke-width="4"/>
|
||||||
|
<circle cx="400" cy="135" r="5" fill="#888888"/>
|
||||||
|
|
||||||
|
<!-- Arme -->
|
||||||
|
<rect x="320" y="220" width="30" height="10" rx="5" fill="#888888"/>
|
||||||
|
<rect x="450" y="220" width="30" height="10" rx="5" fill="#888888"/>
|
||||||
|
|
||||||
|
<!-- Text unter dem Roboter - heller für besseren Kontrast -->
|
||||||
|
<text x="400" y="360" font-family="Arial" font-size="24" fill="#ffffff" text-anchor="middle">{t("404.description")}</text>
|
||||||
|
|
||||||
|
<!-- Dekorative Elemente - heller für besseren Kontrast -->
|
||||||
|
<circle cx="250" cy="100" r="5" fill="#bbbbbb"/>
|
||||||
|
<circle cx="550" cy="150" r="5" fill="#bbbbbb"/>
|
||||||
|
<circle cx="200" cy="300" r="5" fill="#bbbbbb"/>
|
||||||
|
<circle cx="600" cy="250" r="5" fill="#bbbbbb"/>
|
||||||
|
</svg>
|
||||||
|
</PageLayout>
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
import { createGetStaticPaths } from "astro-i18n";
|
|
||||||
import { getCollection } from "astro:content";
|
|
||||||
|
|
||||||
const { tutorial } = Astro.props;
|
|
||||||
|
|
||||||
export const getStaticPaths = createGetStaticPaths(async () => {
|
|
||||||
const tutorials = await getCollection("tutorials");
|
|
||||||
|
|
||||||
return tutorials.map((entry) => ({
|
|
||||||
props: {
|
|
||||||
title: entry.data.title
|
|
||||||
},
|
|
||||||
params: {
|
|
||||||
title: entry.slug,
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
---
|
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
build:
|
build:
|
||||||
- "echo 'PUBLIC_API_SERVER=https://dev.steamwar.de/api' > .env"
|
- "printenv"
|
||||||
- "pnpm run ci"
|
- "echo 'PUBLIC_API_SERVER=https://api.steamwar.de' > .env"
|
||||||
|
- "pnpm install"
|
||||||
|
- "./node_modules/.bin/astro-i18n generate:pages --purge"
|
||||||
|
- "./node_modules/.bin/astro-i18n generate:types"
|
||||||
|
- "./node_modules/.bin/astro build"
|
||||||
|
|
||||||
release:
|
release:
|
||||||
- "rm -r /var/www/dev/*"
|
- "rm -r /var/www/html/*"
|
||||||
- "mv dist/* /var/www/dev"
|
- "mv dist/* /var/www/html"
|
||||||
@@ -9,7 +9,6 @@ module.exports = {
|
|||||||
theme: {
|
theme: {
|
||||||
extend: {
|
extend: {
|
||||||
colors: {
|
colors: {
|
||||||
// flowbite-svelte
|
|
||||||
primary: { 50: '#FFF5F2', 100: '#FFF1EE', 200: '#FFE4DE', 300: '#FFD5CC', 400: '#FFBCAD', 500: '#FE795D', 600: '#EF562F', 700: '#EB4F27', 800: '#CC4522', 900: '#A5371B'},
|
primary: { 50: '#FFF5F2', 100: '#FFF1EE', 200: '#FFE4DE', 300: '#FFD5CC', 400: '#FFBCAD', 500: '#FE795D', 600: '#EF562F', 700: '#EB4F27', 800: '#CC4522', 900: '#A5371B'},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user