update dependencies
deploy / build-and-deploy (push) Failing after 10s

This commit is contained in:
bytedream committed 2026-10-29 13:04:33 +01:00
1 parent b11d25e64b
commit 0de6ee4ca2
21 files changed
+2907 -4481

No files matched your search

+2626 -4198
View File
File diff suppressed because it is too large. Load diff
+29 -24
View File
@@ -11,35 +11,40 @@
"format": "prettier --write ." "format": "prettier --write ."
}, },
"dependencies": { "dependencies": {
"@astrojs/node": "^9.5.1", "@astrojs/node": "^11.1.9",
"@astrojs/svelte": "^7.2.4", "@astrojs/svelte": "^9.1.2",
"@iconify-json/fa-brands": "^1.2.2", "@iconify-json/fa-brands": "^1.2.2",
"@iconify-json/heroicons": "^1.2.3", "@iconify-json/heroicons": "^1.2.3",
"@iconify/tailwind4": "^1.2.0", "@iconify/tailwind4": "^1.2.3",
"@tailwindcss/vite": "^4.1.18", "@tailwindcss/vite": "^4.3.3",
"astro": "^5.16.6", "astro": "^7.4.4",
"bcrypt": "^6.0.0", "bcrypt": "^6.0.0",
"daisyui": "^5.5.14", "daisyui": "^5.7.50",
"drizzle-orm": "^0.45.1", "drizzle-orm": "^0.45.4",
"mysql2": "^3.16.0", "mysql2": "^3.24.6",
"nanostores": "^1.1.0", "nanostores": "^1.5.5",
"pino": "^10.1.0", "pino": "^10.4.0",
"sass-embedded": "^1.97.1", "sass-embedded": "^1.107.0",
"skinview3d": "^3.4.1", "skinview3d": "^3.4.2",
"tailwindcss": "^4.1.18", "tailwindcss": "^4.3.3",
"typescript": "^5.9.3" "typescript": "^6.0.3"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.1",
"@types/bcrypt": "^6.0.0", "@types/bcrypt": "^6.0.0",
"@typescript-eslint/parser": "^8.52.0", "@typescript-eslint/parser": "^8.72.1",
"eslint": "^9.39.2", "eslint": "^10.13.0",
"eslint-plugin-astro": "^1.5.0", "eslint-plugin-astro": "^3.2.1",
"eslint-plugin-svelte": "^3.13.1", "eslint-plugin-svelte": "^3.23.1",
"globals": "^17.0.0", "globals": "^17.13.0",
"prettier": "^3.7.4", "prettier": "^3.9.10",
"prettier-plugin-astro": "^0.14.1", "prettier-plugin-astro": "^1.1.2",
"prettier-plugin-svelte": "^3.4.1", "prettier-plugin-svelte": "^4.1.1",
"svelte": "^5.46.1", "svelte": "^5.57.3",
"typescript-eslint": "^8.52.0" "typescript-eslint": "^8.72.1"
},
"allowScripts": {
"@parcel/watcher": false,
"bcrypt": false
} }
} }
+1 -2
View File
@@ -136,8 +136,7 @@
onchange={(e) => { onchange={(e) => {
entry.onChange(e.currentTarget.value); entry.onChange(e.currentTarget.value);
changes = dynamicSettings.getChanges(); changes = dynamicSettings.getChanges();
}} }}></textarea>
></textarea>
{/if} {/if}
</div> </div>
</label> </label>
+22 -19
View File
@@ -84,10 +84,10 @@ const { signupDisabled, signupHash } = Astro.props;
<div class="divider">Spiel</div> <div class="divider">Spiel</div>
<div class="mx-2 grid grid-cols-1 sm:grid-cols-2 gap-x-4"> <div class="mx-2 grid grid-cols-1 sm:grid-cols-2 gap-x-4">
<Input id="username" type="text" label="Minecraft-Spielername" required dynamicWidth> <Input id="username" type="text" label="Minecraft-Spielername" required dynamicWidth>
<span slot="notice" class="text-[.65rem]" <span slot="notice" class="text-[.65rem]">
>Spielern der Bedrock-Edition wird empfohlen, ihren Microsoft-Account Namen einzugeben. Der Spielern der Bedrock-Edition wird empfohlen, ihren Microsoft-Account Namen einzugeben. Der
Bedrock-Spielername kann nicht immer einem Minecraft Account zugeordnet werden.</span Bedrock-Spielername kann nicht immer einem Minecraft Account zugeordnet werden.
> </span>
</Input> </Input>
<Select <Select
id="edition" id="edition"
@@ -101,11 +101,10 @@ const { signupDisabled, signupHash } = Astro.props;
<div class="mx-2 grid gap-y-3 mb-6"> <div class="mx-2 grid gap-y-3 mb-6">
<Checkbox id="checkbox" required> <Checkbox id="checkbox" required>
<span slot="label"> <span slot="label">
Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden. Siehe <a Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden. Siehe{' '}
class="link" <a class="link" href="https://mhsl.eu/id.html" target="_blank">
href="https://mhsl.eu/id.html" Datenschutz
target="_blank">Datenschutz</a </a>
>
</span> </span>
</Checkbox> </Checkbox>
<Checkbox id="logs" required> <Checkbox id="logs" required>
@@ -120,11 +119,17 @@ const { signupDisabled, signupHash } = Astro.props;
</Checkbox> </Checkbox>
<Checkbox id="rules" required> <Checkbox id="rules" required>
<span slot="label"> <span slot="label">
Ich bin mit den <a class="link" onclick="">Regeln</a> einverstanden und achte sie Ich bin mit den{' '}
<a class="link" onclick="">
Regeln
</a>{' '}
einverstanden und achte sie
</span> </span>
</Checkbox> </Checkbox>
</div> </div>
<button id="send-btn" class="btn btn-neutral">Anmeldung absenden</button> <button id="send-btn" class="btn btn-neutral">
Anmeldung absenden
</button>
</form> </form>
</div> </div>
</div> </div>
@@ -143,14 +148,12 @@ const { signupDisabled, signupHash } = Astro.props;
newRegistrationAllowed={!signupHash} newRegistrationAllowed={!signupHash}
/> />
{ {signupDisabled && (
signupDisabled && ( <div class="absolute top-0 left-0 w-full h-full bg-black/50 backdrop-blur-sm z-10 rounded-xl flex justify-center items-center flex-col pt-20 lg:pt-0 text-2xl sm:text-4xl">
<div class="absolute top-0 left-0 w-full h-full bg-black/50 backdrop-blur-sm z-10 rounded-xl flex justify-center items-center flex-col pt-20 lg:pt-0 text-2xl sm:text-4xl"> <h1>{signupDisabled.message}</h1>
<h1>{signupDisabled.message}</h1> <h3>{signupDisabled.subMessage}</h3>
<h3>{signupDisabled.subMessage}</h3> </div>
</div> )}
)
}
<script> <script>
import { actions } from 'astro:actions'; import { actions } from 'astro:actions';
+1 -4
View File
@@ -35,10 +35,7 @@
<SortableTh style="width: 1%" class="text-left">#</SortableTh> <SortableTh style="width: 1%" class="text-left">#</SortableTh>
{/if} {/if}
{#each keys as key (key.key)} {#each keys as key (key.key)}
<SortableTh <SortableTh class="text-left whitespace-nowrap lg:whitespace-normal" key={key.sortable ? key.key : undefined}>
class="text-left whitespace-nowrap lg:whitespace-normal"
key={key.sortable ? key.key : undefined}
>
{key.label} {key.label}
</SortableTh> </SortableTh>
{/each} {/each}
+1 -2
View File
@@ -31,6 +31,5 @@
bind:value bind:value
{required} {required}
{rows} {rows}
{readonly} {readonly}></textarea>
></textarea>
</fieldset> </fieldset>
+8 -10
View File
@@ -24,16 +24,14 @@ const { title, description, keywords, openGraph, viewTransition } = Astro.props;
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/png" href={favicon.src} /> <link rel="icon" type="image/png" href={favicon.src} />
<title>{title}</title> <title>{title}</title>
{ {openGraph && (
openGraph && ( <>
<> <meta name="og:title" content={title} />
<meta name="og:title" content={title} /> <meta property="og:url" content={Astro.url.pathname} />
<meta property="og:url" content={Astro.url.pathname} /> <meta property="og:type" content="website" />
<meta property="og:type" content="website" /> <meta property="og:image" content={logo512.src} />
<meta property="og:image" content={logo512.src} /> </>
</> )}
)
}
<meta name="description" content={description} /> <meta name="description" content={description} />
{keywords && <meta name="keywords" content={keywords.join(', ')} />} {keywords && <meta name="keywords" content={keywords.join(', ')} />}
<base href=`${BASE_PATH}/` /> <base href=`${BASE_PATH}/` />
+41 -51
View File
@@ -95,9 +95,7 @@ const adminTabs = [
<div class="navbar-center"> <div class="navbar-center">
<a class="text-xl font-bold">{title}</a> <a class="text-xl font-bold">{title}</a>
</div> </div>
<div class="navbar-end"> <div class="navbar-end"><!-- Optional: Profile or logout shortcut --></div>
<!-- Optional: Profile or logout shortcut -->
</div>
</div> </div>
<!-- Content Area --> <!-- Content Area -->
@@ -109,64 +107,56 @@ const adminTabs = [
<!-- Sidebar / Drawer Side --> <!-- Sidebar / Drawer Side -->
<div class="drawer-side z-20"> <div class="drawer-side z-20">
<label for="admin-drawer" aria-label="close sidebar" class="drawer-overlay"></label> <label for="admin-drawer" aria-label="close sidebar" class="drawer-overlay"></label>
<aside <aside class="bg-base-200 w-max max-w-[85vw] h-full flex flex-col justify-between border-r border-base-300 overflow-y-auto">
class="bg-base-200 w-max max-w-[85vw] h-full flex flex-col justify-between border-r border-base-300 overflow-y-auto"
>
<div class="flex flex-col min-w-max"> <div class="flex flex-col min-w-max">
<div class="p-4 hidden lg:block border-b border-base-300"> <div class="p-4 hidden lg:block border-b border-base-300">
<span class="text-xl font-bold">Admin Panel</span> <span class="text-xl font-bold">Admin Panel</span>
</div> </div>
<ul class="menu p-2"> <ul class="menu p-2">
{ {preTabs.map((tab) => (
preTabs.map((tab) => ( <li>
<li> <a href={tab.href}>
<a href={tab.href}> <span class="iconify" class:list={tab.iconClass} />
<span class="iconify" class:list={tab.iconClass} /> <span>{tab.name}</span>
<span>{tab.name}</span> </a>
</a> </li>
</li> ))}
))
}
<div class="divider mx-1 my-1"></div> <div class="divider mx-1 my-1"></div>
{ {adminTabs.map(
adminTabs.map( (tab) =>
(tab) => tab.enabled && (
tab.enabled && ( <li>
<li> <a href={tab.href}>
<a href={tab.href}> <span class="iconify" class:list={tab.iconClass} />
<span class="iconify" class:list={tab.iconClass} /> <span>{tab.name}</span>
<span>{tab.name}</span> </a>
</a> {tab.subTabs && (
{tab.subTabs && ( <ul>
<ul> {tab.subTabs.map((subTab) => (
{tab.subTabs.map((subTab) => ( <li>
<li> <a href={subTab.href}>
<a href={subTab.href}> <span class="iconify" class:list={subTab.iconClass} />
<span class="iconify" class:list={subTab.iconClass} /> <span>{subTab.name}</span>
<span>{subTab.name}</span> </a>
</a> </li>
</li> ))}
))} </ul>
</ul> )}
)} </li>
</li> )
) )}
)
}
</ul> </ul>
</div> </div>
<div class="flex flex-col w-0 min-w-full"> <div class="flex flex-col w-0 min-w-full">
<ul class="menu w-full p-2"> <ul class="menu w-full p-2">
{ {Astro.slots.has('actions') && (
Astro.slots.has('actions') && ( <div class="mb-2">
<div class="mb-2"> <span class="menu-title px-2 uppercase text-xs font-semibold opacity-60">Actions</span>
<span class="menu-title px-2 uppercase text-xs font-semibold opacity-60">Actions</span> <fieldset class="fieldset bg-base-300 border-base-100 rounded-box border p-2">
<fieldset class="fieldset bg-base-300 border-base-100 rounded-box border p-2"> <slot name="actions" />
<slot name="actions" /> </fieldset>
</fieldset> </div>
</div> )}
)
}
<div class="divider mx-1 my-0"></div> <div class="divider mx-1 my-0"></div>
<li> <li>
<button id="logout" class="text-error whitespace-nowrap"> <button id="logout" class="text-error whitespace-nowrap">
+6 -2
View File
@@ -26,8 +26,12 @@ const { title, description, footer = true } = Astro.props;
</div> </div>
<div class="flex gap-12"> <div class="flex gap-12">
<div class="flex gap-4"> <div class="flex gap-4">
<a class="link" href="https://mhsl.eu/id.html" target="_blank">Impressum</a> <a class="link" href="https://mhsl.eu/id.html" target="_blank">
<a class="link" href="https://mhsl.eu/datenschutz.html" target="_blank">Datenschutz</a> Impressum
</a>
<a class="link" href="https://mhsl.eu/datenschutz.html" target="_blank">
Datenschutz
</a>
</div> </div>
<div class="hidden sm:flex gap-2 items-center"> <div class="hidden sm:flex gap-2 items-center">
<a href="ts3server://mhsl.eu?port=9987" title="TeamSpeak" target="_blank"> <a href="ts3server://mhsl.eu?port=9987" title="TeamSpeak" target="_blank">
+2 -3
View File
@@ -6,9 +6,8 @@ import WebsiteLayout from '@layouts/website/WebsiteLayout.astro';
<div class="flex flex-col justify-center items-center gap-4 h-full w-full absolute"> <div class="flex flex-col justify-center items-center gap-4 h-full w-full absolute">
<h1 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl">404: Seite nicht gefunden</h1> <h1 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl">404: Seite nicht gefunden</h1>
<p class="flex gap-2 text-center"> <p class="flex gap-2 text-center">
Es wurde keine Seite unter der URL <code class="contents mx-1 md:block md:my-0 md:whitespace-pre" Es wurde keine Seite unter der URL{' '}
>{Astro.url.pathname}</code <code class="contents mx-1 md:block md:my-0 md:whitespace-pre">{Astro.url.pathname}</code> gefunden.
> gefunden.
</p> </p>
</div> </div>
</WebsiteLayout> </WebsiteLayout>
+35 -37
View File
@@ -48,47 +48,45 @@ const team = [
<div class="m-auto flex flex-col justify-center items-center px-4 py-6 2xl:px-48 sm:py-12"> <div class="m-auto flex flex-col justify-center items-center px-4 py-6 2xl:px-48 sm:py-12">
<h1 class="text-5xl mb-10">Die Admins</h1> <h1 class="text-5xl mb-10">Die Admins</h1>
<div class="grid md:grid-cols-2 xl:grid-cols-3 gap-4 my-4 justify-center"> <div class="grid md:grid-cols-2 xl:grid-cols-3 gap-4 my-4 justify-center">
{ {team.map((member) => (
team.map((member) => ( <div class="card max-w-96 bg-base-200">
<div class="card max-w-96 bg-base-200"> <div class="card-body px-4 py-6">
<div class="card-body px-4 py-6"> <div class="relative flex flex-col items-center">
<div class="relative flex flex-col items-center"> <div class="avatar placeholder mb-2">
<div class="avatar placeholder mb-2"> <div class="bg-neutral text-neutral-content w-24 rounded-xl">
<div class="bg-neutral text-neutral-content w-24 rounded-xl"> <img
<img class="m-[7.5px]"
class="m-[7.5px]" style="width: 85%; height: 85%"
style="width: 85%; height: 85%" src={`https://mc-heads.net/head/${member.nickname.toLowerCase()}`}
src={`https://mc-heads.net/head/${member.nickname.toLowerCase()}`} alt={member.name}
alt={member.name} />
/> </div>
</div>
<p class="text-center text-lg mb-1">
{member.name} · {member.nickname}
</p>
<p class="text-center text-sm font-light">{member.roles.join(' · ')}</p>
{member.links && (
<div class="absolute top-0 right-2 h-24 flex">
<div class="divider divider-horizontal mx-2" />
<div class="flex items-center">
{member.links.map((link) => (
<a
class="flex w-9 h-9 justify-center items-center border rounded-full border-base-content"
href={link.href}
target="_blank"
title={link.name}
>
<span class="iconify size-[22px]" class:list={[link.iconClass]} />
</a>
))}
</div> </div>
</div> </div>
<p class="text-center text-lg mb-1"> )}
{member.name} · {member.nickname}
</p>
<p class="text-center text-sm font-light">{member.roles.join(' · ')}</p>
{member.links && (
<div class="absolute top-0 right-2 h-24 flex">
<div class="divider divider-horizontal mx-2" />
<div class="flex items-center">
{member.links.map((link) => (
<a
class="flex w-9 h-9 justify-center items-center border rounded-full border-base-content"
href={link.href}
target="_blank"
title={link.name}
>
<span class="iconify size-[22px]" class:list={[link.iconClass]} />
</a>
))}
</div>
</div>
)}
</div>
</div> </div>
</div> </div>
)) </div>
} ))}
</div> </div>
</div> </div>
</WebsiteLayout> </WebsiteLayout>
+3 -1
View File
@@ -15,7 +15,9 @@ import Input from '@components/input/Input.svelte';
<Textarea id="content" label="Feedback" dynamicWidth required rows={10} /> <Textarea id="content" label="Feedback" dynamicWidth required rows={10} />
<Input id="email" type="email" label="Email" required /> <Input id="email" type="email" label="Email" required />
</div> </div>
<button id="send" class="btn">Senden</button> <button id="send" class="btn">
Senden
</button>
</form> </form>
</div> </div>
</div> </div>
+19 -19
View File
@@ -180,30 +180,30 @@ nicht gestattet.</p>`
<div class="mx-4 my-6 sm:mx-24 sm:my-12"> <div class="mx-4 my-6 sm:mx-24 sm:my-12">
<h1 class="text-3xl lg:text-5xl mb-16 text-center">FAQ</h1> <h1 class="text-3xl lg:text-5xl mb-16 text-center">FAQ</h1>
<div class="grid lg:grid-cols-2 2xl:grid-cols-3 gap-10"> <div class="grid lg:grid-cols-2 2xl:grid-cols-3 gap-10">
{ {faq.map((questions) => (
faq.map((questions) => ( <div>
<h2 class="text-4xl text-center mb-3">{questions.section}</h2>
<div> <div>
<h2 class="text-4xl text-center mb-3">{questions.section}</h2> {questions.questions.map((question) => (
<div> <>
{questions.questions.map((question) => ( <div class="collapse collapse-arrow">
<> <input type="checkbox" autocomplete="off" />
<div class="collapse collapse-arrow"> <div class="collapse-title">{question.title}</div>
<input type="checkbox" autocomplete="off" /> <div class="collapse-content">
<div class="collapse-title">{question.title}</div> <div class="ml-2" set:html={question.content} />
<div class="collapse-content">
<div class="ml-2" set:html={question.content} />
</div>
</div> </div>
<span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" /> </div>
</> <span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" />
))} </>
</div> ))}
</div> </div>
)) </div>
} ))}
</div> </div>
<div class="w-full flex justify-center mt-6 sm:mt-12"> <div class="w-full flex justify-center mt-6 sm:mt-12">
<a class="btn" href="contact">Deine Frage ist nicht aufgeführt? Schreib uns!</a> <a class="btn" href="contact">
Deine Frage ist nicht aufgeführt? Schreib uns!
</a>
</div> </div>
</div> </div>
</WebsiteLayout> </WebsiteLayout>
+23 -25
View File
@@ -120,33 +120,31 @@ sind aber weiterhin geschützt. Aktivieren kannst du den Modus mit <code>/pvp</c
<div class="mx-4 my-6 sm:mx-12 sm:my-12 xl:mx-32 2xl:mx-64"> <div class="mx-4 my-6 sm:mx-12 sm:my-12 xl:mx-32 2xl:mx-64">
<h1 class="text-3xl lg:text-5xl mb-16 text-center">Features</h1> <h1 class="text-3xl lg:text-5xl mb-16 text-center">Features</h1>
<div class="space-y-8 md:space-y-12"> <div class="space-y-8 md:space-y-12">
{ {features.map((feature, i) => (
features.map((feature, i) => ( <div
<div class="flex flex-col gap-y-3 sm:gap-y-6 md:gap-x-6 lg:gap-x-18 xl:gap-x-24 2xl:gap-x-30 px-8 py-10 bg-base-200 rounded"
class="flex flex-col gap-y-3 sm:gap-y-6 md:gap-x-6 lg:gap-x-18 xl:gap-x-24 2xl:gap-x-30 px-8 py-10 bg-base-200 rounded" class:list={{ 'md:flex-row': i % 2 == 0, 'md:flex-row-reverse': i % 2 != 0 }}
class:list={{ 'md:flex-row': i % 2 == 0, 'md:flex-row-reverse': i % 2 != 0 }} >
> <div class="md:w-5/12 flex flex-col">
<div class="md:w-5/12 flex flex-col"> <h3 class="text-xl mb-4 underline">{feature.name}</h3>
<h3 class="text-xl mb-4 underline">{feature.name}</h3> <ol class="list-disc space-y-2 ml-3">
<ol class="list-disc space-y-2 ml-3"> {feature.details.map((detail) => (
{feature.details.map((detail) => ( <li class="text-base/7" set:html={detail} />
<li class="text-base/7" set:html={detail} /> ))}
</ol>
{feature.icons && (
<div class="h-full flex justify-around items-center">
{feature.icons.map((icon) => (
<img class="w-16 h-16 mr-72 mb-25" src={icon.path} alt={icon.path} />
))} ))}
</ol> </div>
{feature.icons && ( )}
<div class="h-full flex justify-around items-center">
{feature.icons.map((icon) => (
<img class="w-16 h-16 mr-72 mb-25" src={icon.path} alt={icon.path} />
))}
</div>
)}
</div>
<div class="md:w-7/12">
<ImageCarousel images={feature.images} client:idle />
</div>
</div> </div>
)) <div class="md:w-7/12">
} <ImageCarousel images={feature.images} client:idle />
</div>
</div>
))}
</div> </div>
</div> </div>
</WebsiteLayout> </WebsiteLayout>
+3 -1
View File
@@ -30,7 +30,9 @@ if (!feedback) {
readonly={feedback.content !== null} readonly={feedback.content !== null}
/> />
</div> </div>
<button id="send" class="btn" disabled>Feedback senden</button> <button id="send" class="btn" disabled>
Feedback senden
</button>
</form> </form>
</div> </div>
</div> </div>
+37 -35
View File
@@ -40,21 +40,19 @@ const information = [
<div> <div>
<div class="divider"></div> <div class="divider"></div>
<div class="flex flex-col md:flex-row xl:flex-col gap-5"> <div class="flex flex-col md:flex-row xl:flex-col gap-5">
{ {information.map((info) => (
information.map((info) => ( <div>
<div> <h4 class="mb-1 font-bold">{info.title}</h4>
<h4 class="mb-1 font-bold">{info.title}</h4> <p>{info.description}</p>
<p>{info.description}</p> </div>
</div> ))}
))
}
</div> </div>
<div class="divider"></div> <div class="divider"></div>
</div> </div>
<div class="flex justify-center"> <div class="flex justify-center">
<a class="btn btn-outline btn-accent hover:bg-white" href="signup" <a class="btn btn-outline btn-accent hover:bg-white" href="signup">
>{signupEnabled ? 'Jetzt registrieren' : 'Infos zur Anmeldung'}</a {signupEnabled ? 'Jetzt registrieren' : 'Infos zur Anmeldung'}
> </a>
</div> </div>
{signupInfoMessage && <span class="text-center text-xs text-base-content/80 mt-3">{signupInfoMessage}</span>} {signupInfoMessage && <span class="text-center text-xs text-base-content/80 mt-3">{signupInfoMessage}</span>}
</div> </div>
@@ -79,36 +77,36 @@ const information = [
<div> <div>
<h2 class="text-3xl text-black dark:text-white mb-8">Über uns</h2> <h2 class="text-3xl text-black dark:text-white mb-8">Über uns</h2>
<p> <p>
Wir sind ein kleines <a class="link" href="admins">Team</a> von Minecraft-Enthusiasten, das bereits im 9. Jahr in Wir sind ein kleines{' '}
Folge Minecraft CraftAttack organisiert. Jahr für Jahr arbeiten wir daran, das Spielerlebnis zu verbessern und steigeren <a class="link" href="admins">
die Teilnehmerzahl. Team
</a>{' '}
von Minecraft-Enthusiasten, das bereits im 9. Jahr in Folge Minecraft CraftAttack organisiert. Jahr für Jahr
arbeiten wir daran, das Spielerlebnis zu verbessern und steigeren die Teilnehmerzahl.
</p> </p>
<p> <p>
Unser Ziel bei diesem ab dem <span class="italic" Unser Ziel bei diesem ab dem{' '}
>{ <span class="italic">
new Date(START_DATE).toLocaleString('de-DE', { {new Date(START_DATE).toLocaleString('de-DE', {
day: '2-digit', day: '2-digit',
month: 'numeric', month: 'numeric',
year: 'numeric' year: 'numeric'
}) })}
}</span </span>
> stattfindenden Projekts ist es, sicherzustellen, dass alle Spieler eine großartige Erfahrung haben und alles
stattfindenden Projekts ist es, sicherzustellen, dass alle Spieler eine großartige Erfahrung haben und alles reibungslos reibungslos abläuft. Wir freuen uns immer über Anregungen und stehen Dir jederzeit zur Verfügung.
abläuft. Wir freuen uns immer über Anregungen und stehen Dir jederzeit zur Verfügung.
</p> </p>
</div> </div>
</div> </div>
</div> </div>
<div class="flex flex-col justify-center items-center py-20 bg-base-100"> <div class="flex flex-col justify-center items-center py-20 bg-base-100">
{ {statisticsEnabled && (
statisticsEnabled && ( <>
<> <LiveStats />
<LiveStats /> <div class="divider divider-horizontal mx-auto my-6 h-18" />
<div class="divider divider-horizontal mx-auto my-6 h-18" /> </>
</> )}
)
}
<div> <div>
<h3 class="text-center text-2xl mb-6">2025/2026 in Zahlen</h3> <h3 class="text-center text-2xl mb-6">2025/2026 in Zahlen</h3>
<div class="flex flex-col lg:flex-row gap-4"> <div class="flex flex-col lg:flex-row gap-4">
@@ -119,7 +117,9 @@ const information = [
</div> </div>
<div class="stat-title">Abgebaute Blöcke</div> <div class="stat-title">Abgebaute Blöcke</div>
<div class="stat-value">1.41M</div> <div class="stat-value">1.41M</div>
<div class="stat-desc"><span class="underline">975K</span> davon Stein</div> <div class="stat-desc">
<span class="underline">975K</span> davon Stein
</div>
</div> </div>
<div class="stat"> <div class="stat">
<div class="stat-figure"> <div class="stat-figure">
@@ -155,7 +155,9 @@ const information = [
</div> </div>
<div class="stat-title">Spieler Tode</div> <div class="stat-title">Spieler Tode</div>
<div class="stat-value">6351</div> <div class="stat-value">6351</div>
<div class="stat-desc"><span class="underline">348</span> davon durch andere Spieler</div> <div class="stat-desc">
<span class="underline">348</span> davon durch andere Spieler
</div>
</div> </div>
</div> </div>
</div> </div>
+7 -5
View File
@@ -16,10 +16,10 @@ const { report } = Astro.props;
<div class="flex justify-center items-center"> <div class="flex justify-center items-center">
<div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg"> <div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg">
<h2 class="text-3xl text-center"> <h2 class="text-3xl text-center">
Report von <span class="underline">{report.reporter.username}</span> gegen <span Report von <span class="underline">{report.reporter.username}</span> gegen{' '}
id="adversary-username" <span id="adversary-username" class="underline">
class="underline">{report.reported?.username ?? 'unbekannt'}</span {report.reported?.username ?? 'unbekannt'}
> </span>
</h2> </h2>
<form id="report" data-url-hash={report.urlHash} data-adversary-username={report.reported?.username}> <form id="report" data-url-hash={report.urlHash} data-adversary-username={report.reported?.username}>
<div class="space-y-4 my-4"> <div class="space-y-4 my-4">
@@ -29,7 +29,9 @@ const { report } = Astro.props;
<Textarea id="body" value={report.body} label="Details" rows={10} dynamicWidth required /> <Textarea id="body" value={report.body} label="Details" rows={10} dynamicWidth required />
<Dropzone maxFilesBytes={MAX_UPLOAD_BYTES} client:load /> <Dropzone maxFilesBytes={MAX_UPLOAD_BYTES} client:load />
</div> </div>
<button id="send" class="btn" disabled={report.body}>Report senden</button> <button id="send" class="btn" disabled={report.body}>
Report senden
</button>
</div> </div>
</form> </form>
</div> </div>
+16 -18
View File
@@ -11,23 +11,21 @@ const { report } = Astro.props;
<div class="flex justify-center items-center"> <div class="flex justify-center items-center">
<div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg"> <div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg">
{ {report.status?.status == null ? (
report.status?.status == null ? ( <p>Dein Report wird in kürze bearbeitet</p>
<p>Dein Report wird in kürze bearbeitet</p> ) : report.status?.status === 'open' ? (
) : report.status?.status === 'open' ? ( <p>Dein Report befindet sich in Bearbeitung</p>
<p>Dein Report befindet sich in Bearbeitung</p> ) : (
) : ( <>
<> <p>Dein Report wurde bearbeitet</p>
<p>Dein Report wurde bearbeitet</p> <Textarea
<Textarea value={report.status?.statement}
value={report.status?.statement} label="Antwort vom Admin Team (optional)"
label="Antwort vom Admin Team (optional)" rows={5}
rows={5} dynamicWidth
dynamicWidth readonly
readonly />
/> </>
</> )}
)
}
</div> </div>
</div> </div>
+12 -14
View File
@@ -17,21 +17,19 @@ import { rules } from '../rules';
</div> </div>
<span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600"></span> <span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600"></span>
</div> </div>
{ {rules.sections.map((section, i) => (
rules.sections.map((section, i) => ( <div>
<div> <div class="collapse collapse-arrow">
<div class="collapse collapse-arrow"> <input type="checkbox" autocomplete="off" />
<input type="checkbox" autocomplete="off" /> <div class="collapse-title">
<div class="collapse-title"> <p>
<p> {i + 1}. {section.title}
{i + 1}. {section.title} </p>
</p>
</div>
<div class="collapse-content" set:html={section.content} />
</div> </div>
<span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" /> <div class="collapse-content" set:html={section.content} />
</div> </div>
)) <span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" />
} </div>
))}
</div> </div>
</WebsiteLayout> </WebsiteLayout>
+7 -5
View File
@@ -10,9 +10,11 @@ if (!directSignup) return new Response(null, { status: 404 });
<Signup <Signup
signupHash={hash} signupHash={hash}
signupDisabled={directSignup.user signupDisabled={
? { directSignup.user
message: 'Es hat sich bereits jemand mit diesem Einladungslink registriert' ? {
} message: 'Es hat sich bereits jemand mit diesem Einladungslink registriert'
: undefined} }
: undefined
}
/> />
+8 -6
View File
@@ -14,10 +14,12 @@ const signupDisabledSubMessage = signupSetting[SettingKey.SignupDisabledSubMessa
--- ---
<Signup <Signup
signupDisabled={signupEnabled signupDisabled={
? undefined signupEnabled
: { ? undefined
message: signupDisabledMessage, : {
subMessage: signupDisabledSubMessage message: signupDisabledMessage,
}} subMessage: signupDisabledSubMessage
}
}
/> />