style: add svelte support to prettier and format svelte components

This commit is contained in:
2025-03-07 11:17:12 +01:00
parent 540c70216c
commit 5f1404c7d7
14 changed files with 157 additions and 286 deletions

View File

@ -4,5 +4,7 @@
"trailingComma": "es5",
"printWidth": 200,
"bracketSpacing": true,
"arrowParens": "always"
"arrowParens": "always",
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

View File

@ -25,6 +25,7 @@
"flowbite-svelte": "^0.48.4",
"flowbite-svelte-icons": "^2.0.2",
"prettier": "3.5.3",
"prettier-plugin-svelte": "^3.3.3",
"sass-embedded": "^1.85.1",
"svelte": "^5.22.5",
"svelte-check": "^4.1.4",
@ -3600,6 +3601,17 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prettier-plugin-svelte": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.3.tgz",
"integrity": "sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"prettier": "^3.0.0",
"svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
}
},
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",

View File

@ -18,6 +18,7 @@
"flowbite-svelte": "^0.48.4",
"flowbite-svelte-icons": "^2.0.2",
"prettier": "3.5.3",
"prettier-plugin-svelte": "^3.3.3",
"sass-embedded": "^1.85.1",
"svelte": "^5.22.5",
"svelte-check": "^4.1.4",

View File

@ -1,13 +1,13 @@
<script context="module">
import { Router, createRouter } from "@roxi/routify";
import routes from "../.routify/routes.default.js";
import MetaTitle from "./components/meta-title.svelte";
import { Router, createRouter } from "@roxi/routify";
import routes from "../.routify/routes.default.js";
import MetaTitle from "./components/meta-title.svelte";
export const router = createRouter({ routes });
export const router = createRouter({ routes });
router.ready().then(() => {
console.log("Routify router is ready!");
});
router.ready().then(() => {
console.log("Routify router is ready!");
});
</script>
<MetaTitle />

View File

@ -1,12 +1,6 @@
<script lang="ts">
import { onMount } from "svelte";
import {
Button,
Spinner,
InputAddon,
ButtonGroup,
Helper,
} from "flowbite-svelte";
import { Button, Spinner, InputAddon, ButtonGroup, Helper } from "flowbite-svelte";
import { _ } from "svelte-i18n";
import { loading, join_error, create_error, rejoinRoomCode, rejoinRoomSessionData, requestJoinRoom, requestCreateRoom, joinSession, checkSessionData } from "../stores/roomStore";
@ -21,9 +15,7 @@
rawValue = rawValue.slice(0, 6);
}
let formattedValue = rawValue
.replace(/(\d{3})(\d{0,3})/, "$1-$2")
.trim();
let formattedValue = rawValue.replace(/(\d{3})(\d{0,3})/, "$1-$2").trim();
joinRoomId = formattedValue;
@ -63,17 +55,10 @@
class="bg-primary-400 focus:bg-primary-100 dark:bg-primary-800 focus:dark:bg-primary-700 focus:ring-0 text-dark w-full overflow-hidden rounded-xl border-1 border-primary-800"
size="lg"
disabled={$loading && $loading != "create"}
on:click={() =>
joinSession(
$rejoinRoomSessionData?.sessionToken,
$rejoinRoomSessionData?.userId,
)}
on:click={() => joinSession($rejoinRoomSessionData?.sessionToken, $rejoinRoomSessionData?.userId)}
>
{#if $loading == "create"}
<Spinner
class="text-primary-350 dark:text-primary-200 me-3"
size="4"
/>
<Spinner class="text-primary-350 dark:text-primary-200 me-3" size="4" />
{/if}
{$_("landing_page.connect_room.rejoin_last_room")}
</Button>
@ -102,10 +87,7 @@
on:click={() => requestJoinRoom($rejoinRoomCode)}
>
{#if $loading == "create"}
<Spinner
class="text-primary-350 dark:text-primary-200 me-3"
size="4"
/>
<Spinner class="text-primary-350 dark:text-primary-200 me-3" size="4" />
{/if}
{$_("landing_page.connect_room.join_last_room")}
</Button>
@ -115,7 +97,8 @@
{$_(`error_messages.${$create_error}`, {
default: $_("error_messages.error_message", {
values: { error_message: $create_error },
})})}
}),
})}
</span>
</Helper>
{/if}
@ -125,19 +108,11 @@
</div>
{/if}
<div class="mb-4">
<ButtonGroup
class="w-full overflow-hidden rounded-xl border-1 border-primary-800"
size="sm"
>
<InputAddon
class="w-10 text-center bg-primary-400 dark:bg-primary-800"
>
<ButtonGroup class="w-full overflow-hidden rounded-xl border-1 border-primary-800" size="sm">
<InputAddon class="w-10 text-center bg-primary-400 dark:bg-primary-800">
{#if $loading == "join"}
<div class="w-full flex justify-center">
<Spinner
class="text-primary-350 dark:text-primary-200"
size="4.2"
/>
<Spinner class="text-primary-350 dark:text-primary-200" size="4.2" />
</div>
{:else}
<span class="w-full"> # </span>
@ -161,8 +136,8 @@
{$_(`error_messages.${$join_error}`, {
default: $_("error_messages.error_message", {
values: { error_message: $join_error },
})}
)}
}),
})}
</span>
</Helper>
{/if}
@ -178,10 +153,7 @@
on:click={requestCreateRoom}
>
{#if $loading == "create"}
<Spinner
class="text-primary-350 dark:text-primary-200 me-3"
size="4"
/>
<Spinner class="text-primary-350 dark:text-primary-200 me-3" size="4" />
{/if}
{$_("landing_page.connect_room.create_a_room")}
</Button>
@ -191,7 +163,8 @@
{$_(`error_messages.${$create_error}`, {
default: $_("error_messages.error_message", {
values: { error_message: $create_error },
})})}
}),
})}
</span>
</Helper>
{/if}

View File

@ -1,8 +1,8 @@
<script>
import { Banner, Button, Tooltip } from "flowbite-svelte";
import { ArrowUpFromLine, Dot } from "lucide-svelte";
import { slide } from 'svelte/transition';
import { quintOut } from 'svelte/easing';
import { slide } from "svelte/transition";
import { quintOut } from "svelte/easing";
import { _ } from "svelte-i18n";
let bannerStatus = true;
@ -25,5 +25,5 @@
<Button on:click={showFooter} class="!p-2 focus:ring-0 mt-2" color="none">
<ArrowUpFromLine />
</Button>
<Tooltip type='auto'>{$_("landing_page.show_footer")}</Tooltip>
<Tooltip type="auto">{$_("landing_page.show_footer")}</Tooltip>
</div>

View File

@ -1,33 +1,10 @@
<script lang="ts">
import RenamePlayer from "./../RenamePlayer.svelte";
import {
Table,
TableBody,
TableBodyCell,
TableBodyRow,
TableHead,
TableHeadCell,
TableSearch,
Badge,
Button,
Modal,
Popover,
Tooltip,
} from "flowbite-svelte";
import {
CircleArrowOutUpLeft,
Copy,
AlertCircle,
UserX,
Play,
TextCursorInput,
Gamepad2
} from "lucide-svelte";
import { Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell, TableSearch, Badge, Button, Modal, Popover, Tooltip } from "flowbite-svelte";
import { CircleArrowOutUpLeft, Copy, AlertCircle, UserX, Play, TextCursorInput, Gamepad2 } from "lucide-svelte";
import { _ } from "svelte-i18n";
import { GameState, sessionStore } from "../../stores/sessionStore";
import { toggleLobbyOverlay } from '../../stores/gameStore';
import { toggleLobbyOverlay } from "../../stores/gameStore";
let copied = false;
let showLeaveModal = false;
@ -41,9 +18,7 @@
let showKickModal = false;
function filteredPlayers() {
return players.filter((player) =>
player.Username.toLowerCase().includes(searchQuery.toLowerCase()),
);
return players.filter((player) => player.Username.toLowerCase().includes(searchQuery.toLowerCase()));
}
function insert(str: string, index: number, value: string) {
@ -51,23 +26,17 @@
}
function copyGameCodeToClipboard() {
navigator.clipboard
.writeText(insert($sessionStore.joinCode || "000000", 3, "-"))
.then(() => {
copied = true;
setTimeout(() => (copied = false), 2000);
});
navigator.clipboard.writeText(insert($sessionStore.joinCode || "000000", 3, "-")).then(() => {
copied = true;
setTimeout(() => (copied = false), 2000);
});
}
function copyGameLinkToClipboard() {
navigator.clipboard
.writeText(
`${window.location.origin}/Game?join=${$sessionStore.joinCode}`,
)
.then(() => {
copied = true;
setTimeout(() => (copied = false), 2000);
});
navigator.clipboard.writeText(`${window.location.origin}/Game?join=${$sessionStore.joinCode}`).then(() => {
copied = true;
setTimeout(() => (copied = false), 2000);
});
}
function leaveRoom() {
@ -77,71 +46,35 @@
</script>
<!-- Modal: Confirm Leave Room -->
<Modal
bind:open={showLeaveModal}
size="md"
backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50"
autoclose
outsideclose
>
<Modal bind:open={showLeaveModal} size="md" backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50" autoclose outsideclose>
<div class="text-center">
<AlertCircle
class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200"
/>
<AlertCircle class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" />
<h3 class="mb-5 text-lg font-normal text-gray-500 dark:text-gray-400">
{$_("lobby.confirm_leave_message")}
</h3>
<Button
on:click={() => (showLeaveModal = false)}
color="alternative"
class="hover:text-dark hover:bg-gray-100"
>{$_("lobby.cancel")}</Button
>
<Button on:click={leaveRoom} color="red" class="me-2"
>{$_("lobby.confirm_leave")}</Button
>
<Button on:click={() => (showLeaveModal = false)} color="alternative" class="hover:text-dark hover:bg-gray-100">{$_("lobby.cancel")}</Button>
<Button on:click={leaveRoom} color="red" class="me-2">{$_("lobby.confirm_leave")}</Button>
</div>
</Modal>
<!-- Modal: Rename Player -->
<Modal
bind:open={showRenameModal}
size="md"
backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50"
autoclose
outsideclose
>
<Modal bind:open={showRenameModal} size="md" backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50" autoclose outsideclose>
<div class="text-center">
<TextCursorInput
class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200"
/>
<TextCursorInput class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" />
<RenamePlayer playerId={rename_player} />
</div>
</Modal>
<!-- Modal: Confirm Kick Player -->
<Modal
bind:open={showKickModal}
size="md"
backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50"
autoclose
outsideclose
>
<Modal bind:open={showKickModal} size="md" backdropClass="fixed inset-0 z-40 bg-gray-900 bg-black/50 dark:bg-black/80 backdrop-opacity-50" autoclose outsideclose>
<div class="text-center">
<UserX
class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200"
/>
<UserX class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" />
<h3 class="mb-5 text-lg font-normal text-gray-500 dark:text-gray-400">
{$_("lobby.confirm_kick_player_message", {
values: { player_name: sessionStore.getUser(kick_player)?.Username || 'Name not found' },
values: { player_name: sessionStore.getUser(kick_player)?.Username || "Name not found" },
})}
</h3>
<Button
on:click={() => (showLeaveModal = false)}
color="alternative"
class="hover:text-dark hover:bg-gray-100"
>{$_("lobby.cancel")}</Button
>
<Button on:click={() => (showLeaveModal = false)} color="alternative" class="hover:text-dark hover:bg-gray-100">{$_("lobby.cancel")}</Button>
<Button
on:click={() => {
sessionStore.kickPlayer(kick_player);
@ -166,26 +99,26 @@
<!-- Return to game Button -->
{#if sessionStore.getState().gameState !== GameState.Lobby}
<Button
color="none"
class="sm:absolute m-2 right-0 border-2 border-gray-500 dark:border-gray-300 hover:bg-gray-500 dark:hover:bg-gray-300 hover:text-white dark:hover:text-black rounded-full text-gray-500 dark:text-gray-300"
on:click={() => {
toggleLobbyOverlay();
}}
>
<span>{$_("lobby.return_to_game")}</span>
<Gamepad2 class="ml-2" />
</Button>
<Button
color="none"
class="sm:absolute m-2 right-0 border-2 border-gray-500 dark:border-gray-300 hover:bg-gray-500 dark:hover:bg-gray-300 hover:text-white dark:hover:text-black rounded-full text-gray-500 dark:text-gray-300"
on:click={() => {
toggleLobbyOverlay();
}}
>
<span>{$_("lobby.return_to_game")}</span>
<Gamepad2 class="ml-2" />
</Button>
{/if}
<!-- Game Status -->
<div class="text-center p-6 w-full">
<span>{$_("game_status.game_status")}
<span
>{$_("game_status.game_status")}
<Badge color="dark">
{$_(`game_status.${GameState[$sessionStore.gameState].toLowerCase()}`)}
</Badge>
</span
>
</span>
</div>
<!-- TODO Grid not fully responsive -->
@ -196,61 +129,52 @@
{/if}
<!-- Copy Join Code Button -->
<!-- TODO add Streamer mode (hide room code) here -->
<!-- TODO add Streamer mode (hide room code) here -->
{#if sessionStore.getState().gameState === GameState.Lobby}
<Button
id="b1"
type="button"
class="w-xs mx-auto text-dark bg-primary-200 dark:bg-primary-900 hover:bg-primary-200 dark:hover:bg-primary-900 backdrop-blur-lg border border-black/20 dark:border-white/20 shadow-lg p-4 rounded-2xl flex items-center justify-between transition-all cursor-pointer"
on:click={() => {
copyGameCodeToClipboard();
}}
>
<div class="grid justify-items-start">
<span class="text-sm">{$_("lobby.room_join_code")}</span>
<div class="relative">
<span
class="text-xl font-semibold tracking-widest select-none transition-opacity duration-300 opacity-0"
class:opacity-100={!copied}
>{insert($sessionStore.joinCode || "000000", 3, "-")}
</span>
<span
class="absolute left-0 text-xl font-semibold tracking-widest select-none transition-opacity duration-300 opacity-0"
class:opacity-100={copied}
>
{$_("lobby.copied")}
</span>
<Button
id="b1"
type="button"
class="w-xs mx-auto text-dark bg-primary-200 dark:bg-primary-900 hover:bg-primary-200 dark:hover:bg-primary-900 backdrop-blur-lg border border-black/20 dark:border-white/20 shadow-lg p-4 rounded-2xl flex items-center justify-between transition-all cursor-pointer"
on:click={() => {
copyGameCodeToClipboard();
}}
>
<div class="grid justify-items-start">
<span class="text-sm">{$_("lobby.room_join_code")}</span>
<div class="relative">
<span class="text-xl font-semibold tracking-widest select-none transition-opacity duration-300 opacity-0" class:opacity-100={!copied}
>{insert($sessionStore.joinCode || "000000", 3, "-")}
</span>
<span class="absolute left-0 text-xl font-semibold tracking-widest select-none transition-opacity duration-300 opacity-0" class:opacity-100={copied}>
{$_("lobby.copied")}
</span>
</div>
</div>
</div>
<Copy />
</Button>
<Popover
class="text-sm max-w-screen font-light z-100"
triggeredBy="#b1"
placement="bottom"
>
<div class="grid gap-2">
<Button
on:click={() => {
copyGameCodeToClipboard();
}}
>
{$_("lobby.copy_code")}
</Button>
<Button
on:click={() => {
copyGameLinkToClipboard();
}}
>
{$_("lobby.copy_join_link")}
</Button>
{#if sessionStore.getPlayerPermissions().isHost}
<Button on:click={() => {}}>
{$_("lobby.regenerate_join_code")}
<Copy />
</Button>
<Popover class="text-sm max-w-screen font-light z-100" triggeredBy="#b1" placement="bottom">
<div class="grid gap-2">
<Button
on:click={() => {
copyGameCodeToClipboard();
}}
>
{$_("lobby.copy_code")}
</Button>
{/if}
</div>
</Popover>
<Button
on:click={() => {
copyGameLinkToClipboard();
}}
>
{$_("lobby.copy_join_link")}
</Button>
{#if sessionStore.getPlayerPermissions().isHost}
<Button on:click={() => {}}>
{$_("lobby.regenerate_join_code")}
</Button>
{/if}
</div>
</Popover>
{/if}
<!-- Start game button -->
@ -263,10 +187,7 @@
>
<div class="grid justify-items-start">
<div class="relative">
<span
class="text-xl font-semibold tracking-widest select-none transition-opacity duration-300"
>{$_("lobby.start_game")}
</span>
<span class="text-xl font-semibold tracking-widest select-none transition-opacity duration-300">{$_("lobby.start_game")} </span>
</div>
</div>
<Play />
@ -276,10 +197,7 @@
{#if players.length > 5}
<!-- Search Bar -->
<TableSearch
bind:inputValue={searchQuery}
placeholder={$_("lobby.search_player")}
/>
<TableSearch bind:inputValue={searchQuery} placeholder={$_("lobby.search_player")} />
{/if}
<!-- Players Table -->
@ -297,25 +215,17 @@
<TableBodyCell>
{player.Username}
{#if sessionStore.isCurrentPlayer(player.PlayerId)}
<Badge color="purple" class="ml-1"
>{$_("lobby.you")}</Badge
>
<Badge color="purple" class="ml-1">{$_("lobby.you")}</Badge>
{/if}
{#if sessionStore.getPlayerPermissions(player.PlayerId).isHost}
<Badge color="blue" class="ml-1"
>{$_("lobby.host")}</Badge
>
<Badge color="blue" class="ml-1">{$_("lobby.host")}</Badge>
{/if}
</TableBodyCell>
<TableBodyCell>
{#if player.IsConnected}
<Badge color="green"
>{$_(`player_status.connected`)}</Badge
>
<Badge color="green">{$_(`player_status.connected`)}</Badge>
{:else}
<Badge color="yellow"
>{$_(`player_status.disconnected`)}</Badge
>
<Badge color="yellow">{$_(`player_status.disconnected`)}</Badge>
{/if}
</TableBodyCell>
<!-- Can kick and rename player -->
@ -348,9 +258,7 @@
>
<TextCursorInput class="w-7 h-7" />
</Button>
<Tooltip type="auto"
>{$_("lobby.rename_player")}</Tooltip
>
<Tooltip type="auto">{$_("lobby.rename_player")}</Tooltip>
</TableBodyCell>
{/if}
</TableBodyRow>

View File

@ -32,7 +32,7 @@
debounceTimer = setTimeout(() => {
sessionStore.renamePlayer(playerId, newName);
isLoading = false;
unfocusInput()
unfocusInput();
}, 1800);
}
@ -57,29 +57,25 @@
role="button"
tabindex="0"
on:click={focusInput}
on:keydown={(event) => { if (event.key === 'Enter' || event.key === ' ') focusInput(); }}>
on:keydown={(event) => {
if (event.key === "Enter" || event.key === " ") focusInput();
}}
>
<div class="grid justify-items-start w-full">
{#if playerId == sessionStore.getUserId()}
<span class="text-sm">{$_("lobby.rename_yourself")}</span>
<span class="text-sm">{$_("lobby.rename_yourself")}</span>
{:else}
<span class="text-sm">{$_("lobby.rename_player")}</span>
<span class="text-sm">{$_("lobby.rename_player")}</span>
{/if}
<!-- Rename Player -->
<div class="w-full">
<input
class="text-black w-full dark:text-white mr-md w-full border-0 focus:outline-none focus:ring-0 h-8 bg-transparent"
bind:value={playerName}
on:input={onInput}
bind:this={inputRef}
/>
<input class="text-black w-full dark:text-white mr-md w-full border-0 focus:outline-none focus:ring-0 h-8 bg-transparent" bind:value={playerName} on:input={onInput} bind:this={inputRef} />
</div>
</div>
{#if isLoading}
<div class="">
<Spinner
class="text-primary-350 w-8 h-8 dark:text-primary-200"
/>
</div>
{/if}
<div class="">
<Spinner class="text-primary-350 w-8 h-8 dark:text-primary-200" />
</div>
{/if}
</div>

View File

@ -7,15 +7,15 @@
online_player_count: null,
current_game_rooms: null,
games_played: null,
}
};
async function getStats() {
try {
const res = await fetch("/api/stats");
const resJson = await res.json();
stats.online_player_count = resJson?.OnlinePlayerCount
stats.current_game_rooms = resJson?.RunningGames
stats.games_played = resJson?.TotalGamesPlayed
stats.online_player_count = resJson?.OnlinePlayerCount;
stats.current_game_rooms = resJson?.RunningGames;
stats.games_played = resJson?.TotalGamesPlayed;
} catch {}
}
@ -25,11 +25,11 @@
getStats();
// Request stats update every 10s
getStateInterval = setInterval(getStats, 10 * 60 * 1000);
})
});
onDestroy(() => {
clearInterval(getStateInterval);
})
});
</script>
<div class="p-4 bg-primary-50 dark:bg-primary-950 rounded-xl grid content-start justify-items-center w-3xs text-center space-y-2 border-1 border-primary-200 dark:border-primary-800">
@ -41,4 +41,4 @@
<span>{$_("landing_page.stats_container.current_game_rooms", { values: { count: stats.current_game_rooms ?? "..." } })}</span>
<span>{$_("landing_page.stats_container.games_played", { values: { count: stats.games_played ?? "..." } })}</span>
</div>
</div>
</div>

View File

@ -6,18 +6,13 @@
import { sessionStore } from "../stores/sessionStore";
onMount(async () => {
await sessionStore.leaveRoom()
})
await sessionStore.leaveRoom();
});
</script>
<div class="container mx-auto p-6">
<Card
class="max-w-lg mx-auto dark:text-gray-200 rounded-xl text-center space-y-2 flex"
>
<Spinner
class="text-primary-350 dark:text-primary-200 w-12"
size="4.2"
/>
<Card class="max-w-lg mx-auto dark:text-gray-200 rounded-xl text-center space-y-2 flex">
<Spinner class="text-primary-350 dark:text-primary-200 w-12" size="4.2" />
<h1 class="text-2xl font-bold">{$_("leave.leaving_game")}</h1>
</Card>
</div>

View File

@ -2,12 +2,11 @@
import { Button, Card } from "flowbite-svelte";
import { MoveLeft } from "lucide-svelte";
import { _ } from "svelte-i18n";
import { url } from '@roxi/routify'
import { url } from "@roxi/routify";
function goBack() {
window.history.pushState({}, "", "/");
}
</script>
<div class="container mx-auto p-6">
@ -20,8 +19,8 @@
<span>{$_("imprint.go_back")}</span>
</Button>
<Card class="max-w-lg mx-auto dark:text-gray-200 rounded-xl text-center space-y-2">
<Card class="max-w-lg mx-auto dark:text-gray-200 rounded-xl text-center space-y-2">
<h1 class="text-2xl font-bold">{$_("404.404_page_not_found")}</h1>
<h1 class="">{$_("404.page_not_found", { values: { page: $url('$leaf') }})}</h1>
<h1 class="">{$_("404.page_not_found", { values: { page: $url("$leaf") } })}</h1>
</Card>
</div>

View File

@ -20,11 +20,7 @@
<div class="middle-header-group header-group"></div>
<div class="right-header-group header-group gap-2">
<!-- Theme btn -->
<Button
on:click={toggleTheme}
class="!p-2 mt-2 rounded-full focus:bg-primary-700 hover:bg-primary-600 focus:ring-0"
color="none"
>
<Button on:click={toggleTheme} class="!p-2 mt-2 rounded-full focus:bg-primary-700 hover:bg-primary-600 focus:ring-0" color="none">
{#if $theme === "dark"}
<Moon size="2rem" />
{:else if $theme === "light"}

View File

@ -4,7 +4,7 @@
import { _ } from "svelte-i18n";
import Markdown from "svelte-exmarkdown";
import { onMount } from "svelte";
import { goto } from '@roxi/routify'
import { goto } from "@roxi/routify";
// Reactive stores for better state management
let md: string = "";

View File

@ -30,14 +30,8 @@
<div class="flex justify-center">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-8">
<!-- Open source container -->
<div
class="p-4 bg-primary-50 dark:bg-primary-950 rounded-xl grid content-start justify-items-center w-3xs text-center space-y-2 border-1 border-primary-200 dark:border-primary-800"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="48"
height="48"
viewBox="0 0 24 24"
<div class="p-4 bg-primary-50 dark:bg-primary-950 rounded-xl grid content-start justify-items-center w-3xs text-center space-y-2 border-1 border-primary-200 dark:border-primary-800">
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24"
><path
fill="none"
stroke="currentColor"
@ -51,12 +45,7 @@
{$_("landing_page.open_source_container.title")}
</h4>
<span>{$_("landing_page.open_source_container.content")}</span>
<GradientButton
color="purpleToBlue"
class="opacity-75 focus:opacity-100 focus:ring-0"
href="https://github.com/HexCardGames/HexDeck"
target="_blank"
>
<GradientButton color="purpleToBlue" class="opacity-75 focus:opacity-100 focus:ring-0" href="https://github.com/HexCardGames/HexDeck" target="_blank">
{$_("landing_page.open_source_container.github")}
</GradientButton>
</div>