A starkingdoms-client/.gitignore => starkingdoms-client/.gitignore +24 -0
@@ 0,0 1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
A starkingdoms-client/index.html => starkingdoms-client/index.html +43 -0
@@ 0,0 1,43 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <link rel="stylesheet" href="/style.css" />
+ <link rel="stylesheet" href="/themes/catppuccin-mocha/colors.css" />
+ <title>StarKingdoms</title>
+ </head>
+ <body class="bg-grid">
+ <div class="popup" id="server_selector">
+
+ <h1>StarKingdoms</h1>
+ <h2>Join Game</h2>
+
+ <form>
+ <label>Choose server</label>
+
+ <div class="fm-select">
+ <button class="fm-select-button" role="combobox" aria-labelledby="server selector" aria-haspopup="listbox" aria-expanded="false" aria-controls="fm-select-dropdown">
+ <span class="fm-selected-value">StarKingdoms - 0 players</span>
+ <span class="fm-arrow"></span>
+ </button>
+ <ul class="fm-select-dropdown" role="listbox" id="fm-select-dropdown">
+ <!-- Filled by TS -->
+ </ul>
+ </div>
+
+ <label for="username" class="username-label">Username</label>
+ <input class="username-box" id="username" required autocomplete="off"/>
+ <button class="launch-btn">Launch!</button>
+ </form>
+ </div>
+
+ <div id="gamewindow" class="game">
+ <!-- Canvas gets added here by the game script -->
+ </div>
+
+ <span class="footer" id="footer"></span>
+
+ <script type="module" src="src/main.ts"></script>
+ </body>
+</html>
A starkingdoms-client/package.json => starkingdoms-client/package.json +15 -0
@@ 0,0 1,15 @@
+{
+ "name": "starkingdoms-client",
+ "private": true,
+ "version": "0.1.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "typescript": "^5.2.2",
+ "vite": "^5.0.0"
+ }
+}
A => +13 -0
@@ 0,0 1,13 @@
.footer {
font-size: 0.75rem;
line-height: 1rem;
position: absolute;
bottom: 1vh;
left: 1vw;
}
.footer-icon {
vertical-align: middle;
display: inline-block;
width: 1rem;
height: 1rem;
}
\ No newline at end of file
A starkingdoms-client/public/form.css => starkingdoms-client/public/form.css +138 -0
@@ 0,0 1,138 @@
+.launch-btn {
+ appearance: none;
+ width: 100%;
+ padding: 1vh 1vw;
+ margin-top: 1vw;
+ color: var(--text);
+ background: transparent;
+ border: 2px solid var(--links);
+ border-radius: 5px;
+ transition: 0.1s ease-in-out;
+}
+.launch-btn:hover {
+ cursor: pointer;
+ background-color: var(--links-transparent);
+}
+
+.username-label {
+ margin-top: 1vh;
+}
+.fm-select {
+ margin-bottom: 1vh;
+}
+
+.username-box {
+ appearance: none;
+ background: transparent;
+ color: var(--text);
+ padding: 0.675em 1em;
+ border: 1px solid var(--links);
+ border-radius: 0.25rem;
+ cursor: text;
+ width: 100%;
+ max-width: 100%;
+}
+.username-box:focus {
+ outline: none;
+ background-color: var(--links-ultratransparent);
+}
+
+.fm-select-button {
+ appearance: none;
+ background: transparent;
+ color: var(--text);
+ width: 100%;
+ padding: 0.675em 1em;
+ border: 1px solid var(--links);
+ border-radius: 0.25rem;
+ cursor: pointer;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.fm-selected-value {
+ text-align: left;
+}
+.fm-arrow {
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ border-top: 6px solid var(--links);
+ transition: transform ease-in-out 0.3s;
+}
+.fm-select-dropdown {
+ position: absolute;
+ list-style: none;
+ width: 100%;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
+ background-color: var(--bg-secondary-1);
+ border: 1px solid var(--links);
+ border-radius: 4px;
+ padding: 10px;
+ margin-top: 10px;
+ max-height: 200px;
+ overflow-y: auto;
+ transition: 0.2s ease;
+
+ /*transform: scaleY(0);*/
+ opacity: 0;
+ visibility: hidden;
+}
+.fm-select-dropdown:focus-within {
+ box-shadow: 0 10px 25px var(--links-ultratransparent);
+}
+
+.fm-select-dropdown li {
+ position: relative;
+ cursor: pointer;
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+}
+
+.fm-select-dropdown li label {
+ width: 100%;
+ padding: 8px 10px;
+ cursor: pointer;
+}
+
+.fm-select-dropdown::-webkit-scrollbar {
+ width: 7px;
+}
+.fm-select-dropdown::-webkit-scrollbar-track {
+ background: #f1f1f1;
+ border-radius: 25px;
+}
+
+.fm-select-dropdown::-webkit-scrollbar-thumb {
+ background: #ccc;
+ border-radius: 25px;
+}
+
+.fm-select-dropdown li + li {
+ margin-top: 5px;
+}
+
+.fm-select-dropdown li, .fm-select-dropdown input ~ label {
+ border-radius: 5px;
+}
+
+.fm-select-dropdown li:hover, .fm-select-dropdown input:checked ~ label {
+ background-color: var(--surface-0);
+}
+.fm-select-dropdown input:focus ~ label {
+ background-color: var(--surface-1);
+}
+
+.fm-select-dropdown input[type="radio"] {
+ position: absolute;
+ left: 0;
+ opacity: 0;
+}
+.fm-select.active .fm-arrow {
+ transform: rotate(180deg);
+}
+.fm-select.active .fm-select-dropdown {
+ opacity: 1;
+ visibility: visible;
+ /*transform: scaleY(1);*/
+}<
\ No newline at end of file
A starkingdoms-client/public/globals.css => starkingdoms-client/public/globals.css +25 -0
@@ 0,0 1,25 @@
+html {
+ box-sizing: border-box;
+}
+*, *:before, *:after {
+ box-sizing: inherit;
+}
+
+
+body {
+ background-color: var(--bg);
+ color: var(--body);
+ /* Stolen from Tailwind. Looks good in most places. */
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+h1 {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+h2 {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}<
\ No newline at end of file
A starkingdoms-client/public/grid.css => starkingdoms-client/public/grid.css +5 -0
@@ 0,0 1,5 @@
+.bg-grid {
+ background-image: linear-gradient(to right, #80808012 1px, transparent 1px),
+ linear-gradient(to bottom, #80808012 1px, transparent 1px);
+ background-size: 24px 24px;
+}<
\ No newline at end of file
A => +22 -0
@@ 0,0 1,22 @@
.popup {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
padding: 2vh 1vw;
background-color: var(--bg-secondary-1);
width: 19%;
height: min-content;
border-radius: 5px;
}
.popup > h1 {
margin: 0;
}
.popup > h2 {
margin: 0 0 1vh;
color: var(--sub-headline);
}
\ No newline at end of file
A starkingdoms-client/public/style.css => starkingdoms-client/public/style.css +5 -0
@@ 0,0 1,5 @@
+@import "globals.css";
+@import "grid.css";
+@import "popup.css";
+@import "footer.css";
+@import "form.css";<
\ No newline at end of file
A starkingdoms-client/public/themes/catppuccin-common/definitions.css => starkingdoms-client/public/themes/catppuccin-common/definitions.css +34 -0
@@ 0,0 1,34 @@
+/* Common name definitions for all Catppuccin-based themes. */
+/* This is also a good reference if you want to make your own themes, for what variables you *must* define. */
+
+:root {
+ /* Background colors */
+ --bg: rgb(var(--base));
+ --bg-secondary-1: rgb(var(--crust));
+ --bg-secondary-2: rgb(var(--mantle));
+
+ --surface-0: rgb(var(--surface0));
+ --surface-1: rgb(var(--surface1));
+ --surface-2: rgb(var(--surface2));
+
+ --overlay-0: rgb(var(--overlay0));
+ --overlay-1: rgb(var(--overlay1));
+ --overlay-2: rgb(var(--overlay2));
+
+ /* Typography */
+ --body: rgb(var(--text));
+ --headline: rgb(var(--text));
+ --sub-headline: rgb(var(--subtext0));
+ --label: rgb(var(--subtext0));
+ --subtle: rgb(var(--overlay1));
+ --links: rgb(var(--blue));
+ --links-transparent: rgba(var(--blue), 0.35);
+ --links-ultratransparent: rgba(var(--blue), 0.15);
+ --success: rgb(var(--green));
+ --warning: rgb(var(--yellow));
+ --error: rgb(var(--red));
+ --tag: rgb(var(--blue));
+ --pill: rgb(var(--blue));
+ --sel-bg: rgba(var(--surface2), 0.4);
+ --cursor: rgb(var(--rosewater));
+}<
\ No newline at end of file
A starkingdoms-client/public/themes/catppuccin-mocha/colors.css => starkingdoms-client/public/themes/catppuccin-mocha/colors.css +32 -0
@@ 0,0 1,32 @@
+/* Color palette from Catppuccin Mocha. Thanks! */
+@import "../catppuccin-common/definitions.css";
+
+:root {
+ --rosewater: 245, 224, 220;
+ --flamingo: 242, 205, 205;
+ --pink: 245, 194, 231;
+ --mauve: 203, 166, 247;
+ --red: 243, 139, 169;
+ --maroon: 235, 160, 172;
+ --peach: 250, 179, 135;
+ --yellow: 249, 226, 175;
+ --green: 166, 227, 161;
+ --teal: 148, 226, 213;
+ --sky: 137, 220, 235;
+ --sapphire: 116, 199, 236;
+ --blue: 137, 180, 250;
+ --lavender: 180, 190, 254;
+ --text: 205, 214, 244;
+ --subtext1: 186, 194, 222;
+ --subtext0: 166, 173, 200;
+ --overlay2: 147, 153, 178;
+ --overlay1: 127, 132, 156;
+ --overlay0: 108, 112, 134;
+ --surface2: 88, 91, 112;
+ --surface1: 69, 71, 90;
+ --surface0: 49, 50, 68;
+ --base: 30, 30, 46;
+ --mantle: 24, 24, 37;
+ --crust: 17, 17, 27;
+}
+
A starkingdoms-client/src/config.json => starkingdoms-client/src/config.json +8 -0
@@ 0,0 1,8 @@
+{
+ "servers": {
+ "stk-prod": {"name": "StarKingdoms", "url": "wss://starkingdoms.io/", "api": "https://api.starkingdoms.io"},
+ "stk-beta": {"name": "StarKingdoms Beta", "url": "wss://beta.starkingdoms.io/", "api": "https://api.beta.starkingdoms.io"},
+ "stk-unstable": {"name": "StarKingdoms Unstable", "url": "wss://unstable.starkingdoms.io/", "api": "https://api.unstable.starkingdoms.io"},
+ "dev": {"name": "Local", "url": "ws://localhost:3000/", "api": "http://localhost:8080"}
+ }
+}<
\ No newline at end of file
A starkingdoms-client/src/env.d.ts => starkingdoms-client/src/env.d.ts +2 -0
@@ 0,0 1,2 @@
+declare const APP_VERSION: string;
+declare const COMMIT_HASH: string;<
\ No newline at end of file
A starkingdoms-client/src/main.ts => starkingdoms-client/src/main.ts +65 -0
@@ 0,0 1,65 @@
+import CONFIG from "./config.json";
+
+const version_string = `StarKingdoms ${APP_VERSION} (${COMMIT_HASH}) made with <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="footer-icon"><path d="M9.653 16.915l-.005-.003-.019-.01a20.759 20.759 0 01-1.162-.682 22.045 22.045 0 01-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 018-2.828A4.5 4.5 0 0118 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 01-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 01-.69.001l-.002-.001z" /></svg> by the StarKingdoms team`;
+document.getElementById("footer")!.innerHTML = version_string;
+
+// Dropdown stuff
+const custom_select = document.querySelector(".fm-select")!;
+const custom_select_btn = document.querySelector(".fm-select-button")!;
+custom_select_btn.addEventListener("click", (e) => {
+ e.preventDefault();
+ custom_select.classList.toggle("active");
+ custom_select_btn.setAttribute("aria-expanded", custom_select_btn.getAttribute("aria-expanded") === "true" ? "false" : "true");
+});
+
+const selected_value = document.querySelector(".fm-selected-value")!;
+
+// Populate the main page server selector
+interface ConfigServer {
+ name: string;
+ url: string;
+ api: string;
+}
+
+let inverse_server_lookup: {[name: string]: string} = {};
+
+const dropdown = document.getElementById("fm-select-dropdown")!;
+
+for (let server_id in CONFIG.servers) {
+ // @ts-ignore not sure why this complains
+ let server: ConfigServer = CONFIG.servers[server_id];
+ let is_first = Object.keys(inverse_server_lookup).length == 0;
+ let html_text = `
+ <li>
+ <input type="radio" id="${server_id}" name="server" autocomplete="off" ${is_first ? "checked" : ""} />
+ <label for="${server_id}">${server.name}</label>
+ </li>
+ `;
+ inverse_server_lookup[server.name] = server_id;
+ dropdown.innerHTML += html_text;
+ if (is_first) {
+ selected_value.textContent = server.name;
+ }
+}
+
+console.log(inverse_server_lookup);
+
+const options_list = document.querySelectorAll(".fm-select-dropdown li");
+options_list.forEach((option) => {
+ function handler(e: Event) {
+ if (e.type === "click" && (<PointerEvent>e).clientX !== 0 && (<PointerEvent>e).clientY !== 0) {
+ // @ts-ignore
+ selected_value.textContent = this.children[1].textContent;
+ custom_select.classList.remove("active");
+ }
+ if (e.type === "keyup") {
+ console.log((<KeyboardEvent>e).target!);
+ // @ts-ignore
+ selected_value.textContent = this.textContent;
+ custom_select.classList.remove("active");
+ }
+ }
+ option.addEventListener("keyup", handler);
+ option.addEventListener("click", handler);
+})
+
A starkingdoms-client/tsconfig.json => starkingdoms-client/tsconfig.json +23 -0
@@ 0,0 1,23 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
A starkingdoms-client/vite.config.ts => starkingdoms-client/vite.config.ts +12 -0
@@ 0,0 1,12 @@
+import {defineConfig} from "vite";
+import * as child from "child_process";
+
+const commitHash = child.execSync('git describe --no-match --always --abbrev=8 --dirty').toString().trim();
+
+export default defineConfig({
+ plugins: [],
+ define: {
+ APP_VERSION: JSON.stringify(process.env.npm_package_version),
+ COMMIT_HASH: JSON.stringify(commitHash)
+ }
+})<
\ No newline at end of file
A starkingdoms-client/yarn.lock => starkingdoms-client/yarn.lock +265 -0
@@ 0,0 1,265 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@esbuild/android-arm64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.7.tgz#646156aea43e8e6723de6e94a4ac07c5aed41be1"
+ integrity sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==
+
+"@esbuild/android-arm@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz#0827b49aed813c33ea18ee257c1728cdc4a01030"
+ integrity sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==
+
+"@esbuild/android-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.7.tgz#fa294ed5214d88219d519e0ab1bbb0253a89b864"
+ integrity sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==
+
+"@esbuild/darwin-arm64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.7.tgz#e24d2ed545749ff251eabe8bce11fefa688892d3"
+ integrity sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==
+
+"@esbuild/darwin-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.7.tgz#02d1f8a572874c90d8f55dde8a859e5145bd06f6"
+ integrity sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==
+
+"@esbuild/freebsd-arm64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.7.tgz#bc6a69b9a7915da278f0a5ebaec069c813982c22"
+ integrity sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==
+
+"@esbuild/freebsd-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.7.tgz#ec3708488625d70e565968ceea1355e7c8613865"
+ integrity sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==
+
+"@esbuild/linux-arm64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.7.tgz#8e04b66c306858f92d4f90f8222775270755e88a"
+ integrity sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==
+
+"@esbuild/linux-arm@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.7.tgz#12d5b65e089029ee1fe4c591b60969c9b1a85355"
+ integrity sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==
+
+"@esbuild/linux-ia32@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.7.tgz#01eabc2a3ad9039e115db650268e4f48f910dbe2"
+ integrity sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==
+
+"@esbuild/linux-loong64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.7.tgz#70681113632970e6a5766607bbdb98aa18cf4d5f"
+ integrity sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==
+
+"@esbuild/linux-mips64el@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.7.tgz#f63c022a71a3d70c482d1943a27cb8997021e230"
+ integrity sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==
+
+"@esbuild/linux-ppc64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.7.tgz#614eafd08b0c50212f287b948b3c08d6e60f221f"
+ integrity sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==
+
+"@esbuild/linux-riscv64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.7.tgz#31d3b63f92f65968268a8e61ba59872538e80e88"
+ integrity sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==
+
+"@esbuild/linux-s390x@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.7.tgz#be94974e0caa0783ae05f9477fd7170b9ac29cb0"
+ integrity sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==
+
+"@esbuild/linux-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.7.tgz#84e8018a913dd4ecee954623e395984aef3d0007"
+ integrity sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==
+
+"@esbuild/netbsd-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.7.tgz#98898ba8800374c9df9bb182ca4f69fcecaf4411"
+ integrity sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==
+
+"@esbuild/openbsd-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.7.tgz#46dc4eda2adb51f16361b1ad10e9b3f4938c4573"
+ integrity sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==
+
+"@esbuild/sunos-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.7.tgz#1650d40dd88412ecc11490119cd23cbaf661a591"
+ integrity sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==
+
+"@esbuild/win32-arm64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.7.tgz#e61de6c4eb204d83fd912f3ae6812cc8c7d32d25"
+ integrity sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==
+
+"@esbuild/win32-ia32@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.7.tgz#3d9c159d42c67e37a433e44ef8217c661cb6f6d0"
+ integrity sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==
+
+"@esbuild/win32-x64@0.19.7":
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz#02c4446f802706098d8e6ee70cf2b7aba96ded0b"
+ integrity sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==
+
+"@rollup/rollup-android-arm-eabi@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.2.tgz#fa3e9ba323449f098b8d144ecaa4f044d2ff2ee3"
+ integrity sha512-ee7BudTwwrglFYSc3UnqInDDjCLWHKrFmGNi4aK7jlEyg4CyPa1DCMrZfsN1O13YT76UFEqXz2CoN7BCGpUlJw==
+
+"@rollup/rollup-android-arm64@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.2.tgz#961089fe117ceca642b6432fadd093048da93ae8"
+ integrity sha512-xOuhj9HHtn8128ir8veoQsBbAUBasDbHIBniYTEx02pAmu9EXL+ZjJqngnNEy6ZgZ4h1JwL33GMNu3yJL5Mzow==
+
+"@rollup/rollup-darwin-arm64@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.2.tgz#a8c13123b830aa743f604b732d72b260dd9de0f6"
+ integrity sha512-NTGJWoL8bKyqyWFn9/RzSv4hQ4wTbaAv0lHHRwf4OnpiiP4P8W0jiXbm8Nc5BCXKmWAwuvJY82mcIU2TayC20g==
+
+"@rollup/rollup-darwin-x64@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.2.tgz#ab3a46c846bed784e8f52f253c59dcd70175ef24"
+ integrity sha512-hlKqj7bpPvU15sZo4za14u185lpMzdwWLMc9raMqPK4wywt0wR23y1CaVQ4oAFXat3b5/gmRntyfpwWTKl+vvA==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.2.tgz#aa98197f06d9d795a317152ec8d95e65a369053b"
+ integrity sha512-7ZIZx8c3u+pfI0ohQsft/GywrXez0uR6dUP0JhBuCK3sFO5TfdLn/YApnVkvPxuTv3+YKPIZend9Mt7Cz6sS3Q==
+
+"@rollup/rollup-linux-arm64-gnu@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.2.tgz#a0dc66fa46553b8bb1c96df41ae8308770aebecf"
+ integrity sha512-7Pk/5mO11JW/cH+a8lL/i0ZxmRGrbpYqN0VwO2DHhU+SJWWOH2zE1RAcPaj8KqiwC8DCDIJOSxjV9+9lLb6aeA==
+
+"@rollup/rollup-linux-arm64-musl@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.2.tgz#32117bb51bdd761b8f759c9fed9eab493154cdfd"
+ integrity sha512-KrRnuG5phJx756e62wxvWH2e+TK84MP2IVuPwfge+GBvWqIUfVzFRn09TKruuQBXzZp52Vyma7FjMDkwlA9xpg==
+
+"@rollup/rollup-linux-x64-gnu@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.2.tgz#566cda292f95d6ef995344887217a82e9fd20ad6"
+ integrity sha512-My+53GasPa2D2tU5dXiyHYwrELAUouSfkNlZ3bUKpI7btaztO5vpALEs3mvFjM7aKTvEbc7GQckuXeXIDKQ0fg==
+
+"@rollup/rollup-linux-x64-musl@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.2.tgz#d5dcc18af0388209e11586d3c0c9626ba7577b04"
+ integrity sha512-/f0Q6Sc+Vw54Ws6N8fxaEe4R7at3b8pFyv+O/F2VaQ4hODUJcRUcCBJh6zuqtgQQt7w845VTkGLFgWZkP3tUoQ==
+
+"@rollup/rollup-win32-arm64-msvc@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.2.tgz#b880eb1d349f166939ffbe27cbf1efd2e1923819"
+ integrity sha512-NCKuuZWLht6zj7s6EIFef4BxCRX1GMr83S2W4HPCA0RnJ4iHE4FS1695q6Ewoa6A9nFjJe1//yUu0kgBU07Edw==
+
+"@rollup/rollup-win32-ia32-msvc@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.2.tgz#4b799c851864a10491a4755b5b8eadceae3e9889"
+ integrity sha512-J5zL3riR4AOyU/J3M/i4k/zZ8eP1yT+nTmAKztCXJtnI36jYH0eepvob22mAQ/kLwfsK2TB6dbyVY1F8c/0H5A==
+
+"@rollup/rollup-win32-x64-msvc@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.2.tgz#7e59216d929a6b444304000be40c32d2d127fe4f"
+ integrity sha512-pL0RXRHuuGLhvs7ayX/SAHph1hrDPXOM5anyYUQXWJEENxw3nfHkzv8FfVlEVcLyKPAEgDRkd6RKZq2SMqS/yg==
+
+esbuild@^0.19.3:
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84"
+ integrity sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.19.7"
+ "@esbuild/android-arm64" "0.19.7"
+ "@esbuild/android-x64" "0.19.7"
+ "@esbuild/darwin-arm64" "0.19.7"
+ "@esbuild/darwin-x64" "0.19.7"
+ "@esbuild/freebsd-arm64" "0.19.7"
+ "@esbuild/freebsd-x64" "0.19.7"
+ "@esbuild/linux-arm" "0.19.7"
+ "@esbuild/linux-arm64" "0.19.7"
+ "@esbuild/linux-ia32" "0.19.7"
+ "@esbuild/linux-loong64" "0.19.7"
+ "@esbuild/linux-mips64el" "0.19.7"
+ "@esbuild/linux-ppc64" "0.19.7"
+ "@esbuild/linux-riscv64" "0.19.7"
+ "@esbuild/linux-s390x" "0.19.7"
+ "@esbuild/linux-x64" "0.19.7"
+ "@esbuild/netbsd-x64" "0.19.7"
+ "@esbuild/openbsd-x64" "0.19.7"
+ "@esbuild/sunos-x64" "0.19.7"
+ "@esbuild/win32-arm64" "0.19.7"
+ "@esbuild/win32-ia32" "0.19.7"
+ "@esbuild/win32-x64" "0.19.7"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+nanoid@^3.3.6:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.4.31:
+ version "8.4.31"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
+ dependencies:
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+rollup@^4.2.0:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.5.2.tgz#2cf0ef0a57cb4038c50a66356684fd30071d0595"
+ integrity sha512-CRK1uoROBfkcqrZKyaFcqCcZWNsvJ6yVYZkqTlRocZhO2s5yER6Z3f/QaYtO8RGyloPnmhwgzuPQpNGeK210xQ==
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.5.2"
+ "@rollup/rollup-android-arm64" "4.5.2"
+ "@rollup/rollup-darwin-arm64" "4.5.2"
+ "@rollup/rollup-darwin-x64" "4.5.2"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.5.2"
+ "@rollup/rollup-linux-arm64-gnu" "4.5.2"
+ "@rollup/rollup-linux-arm64-musl" "4.5.2"
+ "@rollup/rollup-linux-x64-gnu" "4.5.2"
+ "@rollup/rollup-linux-x64-musl" "4.5.2"
+ "@rollup/rollup-win32-arm64-msvc" "4.5.2"
+ "@rollup/rollup-win32-ia32-msvc" "4.5.2"
+ "@rollup/rollup-win32-x64-msvc" "4.5.2"
+ fsevents "~2.3.2"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+typescript@^5.2.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43"
+ integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==
+
+vite@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.2.tgz#3c94627dace83b9bf04b64eaf618038e30fb95c0"
+ integrity sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==
+ dependencies:
+ esbuild "^0.19.3"
+ postcss "^8.4.31"
+ rollup "^4.2.0"
+ optionalDependencies:
+ fsevents "~2.3.3"