diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a94f9161 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules +npm-debug.log +yarn-error.log +.git +.gitignore +.dockerignore +Dockerfile +*.md +.vscode +.idea +.env +.env.* +build \ No newline at end of file diff --git a/.gitignore b/.gitignore index 25e5f3e2..d9129b77 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ node_modules vite.config.js.timestamp-* vite.config.ts.timestamp-* .idea -/.npm-only-allow \ No newline at end of file +.vscode +/.npm-only-allow diff --git a/.prettierignore b/.prettierignore index a8a3abc7..d0e76f4f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,7 +6,8 @@ node_modules/ .env .env.* !.env.example - +**/*.lockb +**/*ignore # Ignore files for PNPM, NPM and YARN pnpm-lock.yaml package-lock.json diff --git a/.sonarlint/connectedMode.json b/.sonarlint/connectedMode.json new file mode 100644 index 00000000..e40e90cb --- /dev/null +++ b/.sonarlint/connectedMode.json @@ -0,0 +1,4 @@ +{ + "sonarCloudOrganization": "dval-in", + "projectKey": "dval-in_dvalin-frontend" +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..5d5cc0ab --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# sonarqube analysis should ignore this file +# sonarqube.analysis.skip=true +FROM node:20-alpine + +# Install pnpm +RUN npm install -g pnpm + +WORKDIR /app + +COPY . . + +# Install dependencies +RUN pnpm install --frozen-lockfile + +# Copy the rest of the application code +COPY . . + + +ARG VITE_BACKEND_URL +ENV VITE_BACKEND_URL=$VITE_BACKEND_URL + +# Build the application +RUN pnpm run build + +# Expose the port the app runs on +EXPOSE 8080 + +# Command to run the application +CMD ["pnpm", "run", "preview"] \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 00000000..e85dc32e Binary files /dev/null and b/bun.lockb differ diff --git a/package.json b/package.json index af405d2d..ef75c96e 100644 --- a/package.json +++ b/package.json @@ -13,64 +13,70 @@ "generate-pwa-assets": "pwa-assets-generator" }, "dependencies": { - "@internationalized/date": "^3.5.4", + "@internationalized/date": "^3.5.6", "@mdi/js": "^7.4.47", - "@tanstack/svelte-query": "^5.51.1", - "bits-ui": "^0.21.12", + "@tanstack/svelte-query": "^5.59.16", + "@types/lodash-es": "^4.17.12", + "bits-ui": "^0.21.16", "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", "d3-scale": "^4.0.2", "d3-shape": "^3.2.0", + "dvalin-data": "^1.0.3", "formsnap": "^1.0.1", - "i18next": "^23.12.1", - "layerchart": "^0.43.7", - "lucide-svelte": "^0.408.0", - "mode-watcher": "^0.4.0", - "socket.io": "^4.7.5", - "socket.io-client": "^4.7.5", + "i18next": "^23.16.4", + "layerchart": "^0.54.1", + "lodash-es": "^4.17.21", + "lucide-svelte": "^0.453.0", + "mode-watcher": "^0.4.1", + "simple-icons": "^13.15.0", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.1", "svelte-i18next": "^2.2.2", + "svelte-legos": "^0.2.5", "svelte-persisted-store": "^0.11.0", - "svelte-sonner": "^0.3.27", - "svelte-ux": "^0.73.2", - "sveltekit-superforms": "^2.16.0", - "tailwind-merge": "^2.4.0", + "svelte-sonner": "^0.3.28", + "svelte-ux": "^0.75.1", + "sveltekit-superforms": "^2.20.0", + "tailwind-merge": "^2.5.4", "tailwind-variants": "^0.2.1", - "tw-colors": "^3.3.1", + "tw-colors": "^3.3.2", + "vaul-svelte": "^0.3.2", "zod": "^3.23.8" }, "devDependencies": { - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", - "@sveltejs/adapter-static": "^3.0.2", - "@sveltejs/kit": "^2.5.18", - "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.7.3", + "@sveltejs/vite-plugin-svelte": "^3.1.2", "@types/d3-scale": "^4.0.8", "@types/d3-shape": "^3.1.6", - "@types/eslint": "8.56.10", - "@vite-pwa/assets-generator": "^0.2.4", - "@vite-pwa/sveltekit": "^0.6.0", - "autoprefixer": "^10.4.19", - "eslint": "^9.7.0", + "@types/eslint": "9.6.1", + "@vite-pwa/assets-generator": "^0.2.6", + "@vite-pwa/sveltekit": "^0.6.6", + "autoprefixer": "^10.4.20", + "eslint": "^9.13.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-svelte": "^2.42.0", - "husky": "^9.0.11", - "lint-staged": "^15.2.7", - "postcss": "^8.4.39", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-svelte": "^2.46.0", + "husky": "^9.1.6", + "lint-staged": "^15.2.10", + "postcss": "^8.4.47", "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.5", - "sass": "^1.77.8", - "svelte": "^4.2.18", - "svelte-check": "^3.8.4", - "svelte-eslint-parser": "^0.39.2", + "prettier-plugin-svelte": "^3.2.7", + "sass": "^1.80.4", + "svelte": "^4.2.19", + "svelte-check": "^4.0.5", + "svelte-eslint-parser": "^0.43.0", "svelte-headless-table": "^0.18.2", "svelte-lucide": "^1.0.6", - "tailwindcss": "^3.4.4", - "tslib": "^2.6.3", - "typescript": "^5.5.3", - "typescript-eslint": "^7.16.0", - "vite": "^5.3.3", - "vite-plugin-pwa": "^0.20.0" + "tailwindcss": "^3.4.14", + "tslib": "^2.8.0", + "typescript": "^5.6.3", + "typescript-eslint": "^8.12.2", + "vite": "^5.4.10", + "vite-plugin-pwa": "^0.20.5" }, "engines": { "node": ">=20.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93ac1dc8..b1168075 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,93 +9,111 @@ importers: .: dependencies: '@internationalized/date': - specifier: ^3.5.4 - version: 3.5.4 + specifier: ^3.5.6 + version: 3.5.6 '@mdi/js': specifier: ^7.4.47 version: 7.4.47 '@tanstack/svelte-query': - specifier: ^5.51.1 - version: 5.51.1(svelte@4.2.18) + specifier: ^5.59.16 + version: 5.59.16(svelte@4.2.19) + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 bits-ui: - specifier: ^0.21.12 - version: 0.21.12(svelte@4.2.18) + specifier: ^0.21.16 + version: 0.21.16(svelte@4.2.19) clsx: specifier: ^2.1.1 version: 2.1.1 cmdk-sv: specifier: ^0.0.18 - version: 0.0.18(svelte@4.2.18) + version: 0.0.18(svelte@4.2.19) d3-scale: specifier: ^4.0.2 version: 4.0.2 d3-shape: specifier: ^3.2.0 version: 3.2.0 + dvalin-data: + specifier: ^1.0.3 + version: 1.0.3 formsnap: specifier: ^1.0.1 - version: 1.0.1(svelte@4.2.18)(sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)) + version: 1.0.1(svelte@4.2.19)(sveltekit-superforms@2.20.0(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@types/json-schema@7.0.15)(svelte@4.2.19)(typescript@5.6.3)) i18next: - specifier: ^23.12.1 - version: 23.12.1 + specifier: ^23.16.4 + version: 23.16.4 layerchart: - specifier: ^0.43.7 - version: 0.43.7(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18)(typescript@5.5.3) + specifier: ^0.54.1 + version: 0.54.1(svelte@4.2.19)(typescript@5.6.3) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 lucide-svelte: - specifier: ^0.408.0 - version: 0.408.0(svelte@4.2.18) + specifier: ^0.453.0 + version: 0.453.0(svelte@4.2.19) mode-watcher: - specifier: ^0.4.0 - version: 0.4.0(svelte@4.2.18) + specifier: ^0.4.1 + version: 0.4.1(svelte@4.2.19) + simple-icons: + specifier: ^13.15.0 + version: 13.15.0 socket.io: - specifier: ^4.7.5 - version: 4.7.5 + specifier: ^4.8.1 + version: 4.8.1 socket.io-client: - specifier: ^4.7.5 - version: 4.7.5 + specifier: ^4.8.1 + version: 4.8.1 svelte-i18next: specifier: ^2.2.2 - version: 2.2.2(i18next@23.12.1)(svelte@4.2.18) + version: 2.2.2(i18next@23.16.4)(svelte@4.2.19) + svelte-legos: + specifier: ^0.2.5 + version: 0.2.5(svelte@4.2.19) svelte-persisted-store: specifier: ^0.11.0 - version: 0.11.0(svelte@4.2.18) + version: 0.11.0(svelte@4.2.19) svelte-sonner: - specifier: ^0.3.27 - version: 0.3.27(svelte@4.2.18) + specifier: ^0.3.28 + version: 0.3.28(svelte@4.2.19) svelte-ux: - specifier: ^0.73.2 - version: 0.73.2(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18) + specifier: ^0.75.1 + version: 0.75.1(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4)(svelte@4.2.19) sveltekit-superforms: - specifier: ^2.16.0 - version: 2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18) + specifier: ^2.20.0 + version: 2.20.0(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@types/json-schema@7.0.15)(svelte@4.2.19)(typescript@5.6.3) tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.5.4 + version: 2.5.4 tailwind-variants: specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.4) + version: 0.2.1(tailwindcss@3.4.14) tw-colors: - specifier: ^3.3.1 - version: 3.3.1(tailwindcss@3.4.4) + specifier: ^3.3.2 + version: 3.3.2(tailwindcss@3.4.14) + vaul-svelte: + specifier: ^0.3.2 + version: 0.3.2(svelte@4.2.19) zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@commitlint/cli': - specifier: ^19.3.0 - version: 19.3.0(@types/node@20.11.30)(typescript@5.5.3) + specifier: ^19.5.0 + version: 19.5.0(@types/node@20.11.30)(typescript@5.6.3) '@commitlint/config-conventional': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.5.0 + version: 19.5.0 '@sveltejs/adapter-static': - specifier: ^3.0.2 - version: 3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))) + specifier: ^3.0.6 + version: 3.0.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))) '@sveltejs/kit': - specifier: ^2.5.18 - version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + specifier: ^2.7.3 + version: 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.1 - version: 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + specifier: ^3.1.2 + version: 3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) '@types/d3-scale': specifier: ^4.0.8 version: 4.0.8 @@ -103,80 +121,80 @@ importers: specifier: ^3.1.6 version: 3.1.6 '@types/eslint': - specifier: 8.56.10 - version: 8.56.10 + specifier: 9.6.1 + version: 9.6.1 '@vite-pwa/assets-generator': - specifier: ^0.2.4 - version: 0.2.4 + specifier: ^0.2.6 + version: 0.2.6 '@vite-pwa/sveltekit': - specifier: ^0.6.0 - version: 0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0)) + specifier: ^0.6.6 + version: 0.6.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.20.5(@vite-pwa/assets-generator@0.2.6)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0)) autoprefixer: - specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.39) + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) eslint: - specifier: ^9.7.0 - version: 9.7.0 + specifier: ^9.13.0 + version: 9.13.0(jiti@1.21.0) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.7.0) + version: 9.1.0(eslint@9.13.0(jiti@1.21.0)) eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.7.0))(eslint@9.7.0)(prettier@3.3.3) + specifier: ^5.2.1 + version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.0)))(eslint@9.13.0(jiti@1.21.0))(prettier@3.3.3) eslint-plugin-svelte: - specifier: ^2.42.0 - version: 2.42.0(eslint@9.7.0)(svelte@4.2.18) + specifier: ^2.46.0 + version: 2.46.0(eslint@9.13.0(jiti@1.21.0))(svelte@4.2.19) husky: - specifier: ^9.0.11 - version: 9.0.11 + specifier: ^9.1.6 + version: 9.1.6 lint-staged: - specifier: ^15.2.7 - version: 15.2.7 + specifier: ^15.2.10 + version: 15.2.10 postcss: - specifier: ^8.4.39 - version: 8.4.39 + specifier: ^8.4.47 + version: 8.4.47 prettier: specifier: ^3.3.3 version: 3.3.3 prettier-plugin-svelte: - specifier: ^3.2.5 - version: 3.2.5(prettier@3.3.3)(svelte@4.2.18) + specifier: ^3.2.7 + version: 3.2.7(prettier@3.3.3)(svelte@4.2.19) sass: - specifier: ^1.77.8 - version: 1.77.8 + specifier: ^1.80.4 + version: 1.80.4 svelte: - specifier: ^4.2.18 - version: 4.2.18 + specifier: ^4.2.19 + version: 4.2.19 svelte-check: - specifier: ^3.8.4 - version: 3.8.4(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18) + specifier: ^4.0.5 + version: 4.0.5(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) svelte-eslint-parser: - specifier: ^0.39.2 - version: 0.39.2(svelte@4.2.18) + specifier: ^0.43.0 + version: 0.43.0(svelte@4.2.19) svelte-headless-table: specifier: ^0.18.2 - version: 0.18.2(svelte@4.2.18) + version: 0.18.2(svelte@4.2.19) svelte-lucide: specifier: ^1.0.6 - version: 1.0.6(svelte@4.2.18) + version: 1.0.6(svelte@4.2.19) tailwindcss: - specifier: ^3.4.4 - version: 3.4.4 + specifier: ^3.4.14 + version: 3.4.14 tslib: - specifier: ^2.6.3 - version: 2.6.3 + specifier: ^2.8.0 + version: 2.8.0 typescript: - specifier: ^5.5.3 - version: 5.5.3 + specifier: ^5.6.3 + version: 5.6.3 typescript-eslint: - specifier: ^7.16.0 - version: 7.16.0(eslint@9.7.0)(typescript@5.5.3) + specifier: ^8.12.2 + version: 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) + specifier: ^5.4.10 + version: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) vite-plugin-pwa: - specifier: ^0.20.0 - version: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0) + specifier: ^0.20.5 + version: 0.20.5(@vite-pwa/assets-generator@0.2.6)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0) packages: @@ -201,11 +219,11 @@ packages: peerDependencies: ajv: '>=8' - '@arktype/schema@0.1.13': - resolution: {integrity: sha512-qZjtCAKrnhsixDWsEGJtosWfi4bLpAg4OnnICVYTer/6v5hwlhsdYpYobTSJUc5eiBoI5Ai/kcNfYaQISshY2g==} + '@ark/schema@0.10.0': + resolution: {integrity: sha512-zpfXwWLOzj9aUK+dXQ6aleJAOgle4/WrHDop5CMX2M88dFQ85NdH8O0v0pvMAQnfFcaQAZ/nVDYLlBJsFc09XA==} - '@arktype/util@0.0.48': - resolution: {integrity: sha512-U5FO5EUAJ4LoYtLSyAMmTf6CEVgslObfSQuua2zoK5Tv2FB3aESVQ3rdLfhuz+coRhlzlynbkmimyoQWwQT+aQ==} + '@ark/util@0.10.0': + resolution: {integrity: sha512-uK+9VU5doGMYOoOZVE+XaSs1vYACoaEJdrDkuBx26S4X7y3ChyKsPnIg/9pIw2vUySph1GkAXbvBnfVE2GmXgQ==} '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} @@ -780,75 +798,80 @@ packages: '@canvas/image-data@1.0.0': resolution: {integrity: sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==} - '@commitlint/cli@19.3.0': - resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} + '@commitlint/cli@19.5.0': + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@19.2.2': - resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} + '@commitlint/config-conventional@19.5.0': + resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==} engines: {node: '>=v18'} - '@commitlint/config-validator@19.0.3': - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} - '@commitlint/ensure@19.0.3': - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} engines: {node: '>=v18'} - '@commitlint/execute-rule@19.0.0': - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} - '@commitlint/format@19.3.0': - resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} engines: {node: '>=v18'} - '@commitlint/is-ignored@19.2.2': - resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + '@commitlint/is-ignored@19.5.0': + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} engines: {node: '>=v18'} - '@commitlint/lint@19.2.2': - resolution: {integrity: sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==} + '@commitlint/lint@19.5.0': + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} engines: {node: '>=v18'} - '@commitlint/load@19.2.0': - resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} - '@commitlint/message@19.0.0': - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} engines: {node: '>=v18'} - '@commitlint/parse@19.0.3': - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} engines: {node: '>=v18'} - '@commitlint/read@19.2.1': - resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==} + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@19.1.0': - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} - '@commitlint/rules@19.0.3': - resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + '@commitlint/rules@19.5.0': + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} engines: {node: '>=v18'} - '@commitlint/to-lines@19.0.0': - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} engines: {node: '>=v18'} - '@commitlint/top-level@19.0.0': - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} engines: {node: '>=v18'} - '@commitlint/types@19.0.3': - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} engines: {node: '>=v18'} + '@effect/schema@0.75.5': + resolution: {integrity: sha512-TQInulTVCuF+9EIbJpyLP6dvxbQJMphrnRqgexm/Ze39rSjfhJuufF7XvU3SxTgg3HnL7B/kpORTJbHhlE6thw==} + peerDependencies: + effect: ^3.9.2 + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -993,44 +1016,54 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.0': - resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.7.0': - resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} + '@eslint/js@9.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/schemasafe@1.3.0': resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} '@floating-ui/core@1.6.0': resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - '@floating-ui/dom@1.6.7': - resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - '@floating-ui/utils@0.2.4': - resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - '@fortawesome/fontawesome-common-types@6.5.2': - resolution: {integrity: sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==} + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@fortawesome/fontawesome-common-types@6.6.0': + resolution: {integrity: sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==} engines: {node: '>=6'} '@gcornut/valibot-json-schema@0.31.0': @@ -1043,16 +1076,24 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@internationalized/date@3.5.4': - resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + '@internationalized/date@3.5.6': + resolution: {integrity: sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1079,6 +1120,18 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@layerstack/svelte-actions@0.0.7': + resolution: {integrity: sha512-PYG4oocNQxuUKQkhQvrB+nh4SGGzVr2KlqGS8wivXC4lF78BpOnsZfLxv657oVBBE+u3Cx6q9NRq/AG1A7ZiIw==} + + '@layerstack/svelte-stores@0.0.6': + resolution: {integrity: sha512-QCYU2QIOGNVcstkyJDkVHPDxBUX1/9Nb5bYt6JuhmFgSrfdYKx8DlZlax3jMEmjdu2htQRmj/qSZe+xK4HFngA==} + + '@layerstack/tailwind@0.0.9': + resolution: {integrity: sha512-bmv4qEgmJWgAiUqznj7WSQ3vCEoA80iXztEuSO2jsS1nJ2/676VguAQ/6SGiWm2uoxgJ5BCPAP/AYOowZOkI8g==} + + '@layerstack/utils@0.0.5': + resolution: {integrity: sha512-Ew84WuCMC3q7Wq0Tb0rBEM/WK2RkkxRBF/RvNcnbaWcj5O+jO6VEZc657Jv73skkIJ4fkciT8FhSIcHoRkhdrQ==} + '@mdi/js@7.4.47': resolution: {integrity: sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==} @@ -1099,6 +1152,82 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1152,78 +1281,83 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/rollup-android-arm-eabi@4.14.1': - resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.14.1': - resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.14.1': - resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.14.1': - resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.14.1': - resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.14.1': - resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.14.1': - resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': - resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} - cpu: [ppc64le] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.14.1': - resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.14.1': - resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.14.1': - resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.14.1': - resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.14.1': - resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.14.1': - resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.14.1': - resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] @@ -1236,29 +1370,26 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.32.34': - resolution: {integrity: sha512-a3Z3ytYl6R/+7ldxx04PO1semkwWlX/8pTqxsPw4quIcIXDFPZhOc1Wx8azWmkU26ccK3mHwcWenn0avNgAKQg==} + '@sinclair/typebox@0.32.35': + resolution: {integrity: sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA==} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@sodaru/yup-to-json-schema@2.0.1': - resolution: {integrity: sha512-lWb0Wiz8KZ9ip/dY1eUqt7fhTPmL24p6Hmv5Fd9pzlzAdw/YNcWZr+tiCT4oZ4Zyxzi9+1X4zv82o7jYvcFxYA==} - '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - '@sveltejs/adapter-static@3.0.2': - resolution: {integrity: sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==} + '@sveltejs/adapter-static@3.0.6': + resolution: {integrity: sha512-MGJcesnJWj7FxDcB/GbrdYD3q24Uk0PIL4QIX149ku+hlJuj//nxUbb0HxUTpjkecWfHjVveSUnUaQWnPRXlpg==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.5.18': - resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==} + '@sveltejs/kit@2.7.3': + resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 @@ -1270,8 +1401,8 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@3.1.1': - resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} + '@sveltejs/vite-plugin-svelte@3.1.2': + resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 @@ -1280,11 +1411,11 @@ packages: '@swc/helpers@0.5.3': resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} - '@tanstack/query-core@5.51.1': - resolution: {integrity: sha512-fJBMQMpo8/KSsWW5ratJR5+IFr7YNJ3K2kfP9l5XObYHsgfVy1w3FJUWU4FT2fj7+JMaEg33zOcNDBo0LMwHnw==} + '@tanstack/query-core@5.59.16': + resolution: {integrity: sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==} - '@tanstack/svelte-query@5.51.1': - resolution: {integrity: sha512-MpovODB8oshrXSYgd75i3GYOh5mxaXYGrQfSReF52U8szCLoHG6RvQuTgiyOPx7qkRW0xyxwOVhOoS25sFUSMw==} + '@tanstack/svelte-query@5.59.16': + resolution: {integrity: sha512-s0CRtjUK0Lo+uvRU+XFxWjmTRV1hr0fe+Z/R+wDGnTzbMKSyaSKYeC0aZSQKZdAO6R/DvEVrD9tgjof1ojufnQ==} peerDependencies: svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 @@ -1312,8 +1443,8 @@ packages: '@types/d3-time@3.0.3': resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -1321,15 +1452,21 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.10': + resolution: {integrity: sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==} + '@types/node@20.11.30': resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - '@types/pug@2.0.10': - resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1339,63 +1476,78 @@ packages: '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} - '@typescript-eslint/eslint-plugin@7.16.0': - resolution: {integrity: sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typeschema/class-validator@0.3.0': + resolution: {integrity: sha512-OJSFeZDIQ8EK1HTljKLT5CItM2wsbgczLN8tMEfz3I1Lmhc5TBfkZ0eikFzUC16tI3d1Nag7um6TfCgp2I2Bww==} + peerDependencies: + class-validator: ^0.14.1 + peerDependenciesMeta: + class-validator: + optional: true + + '@typeschema/core@0.14.0': + resolution: {integrity: sha512-Ia6PtZHcL3KqsAWXjMi5xIyZ7XMH4aSnOQes8mfMLx+wGFGtGRNlwe6Y7cYvX+WfNK67OL0/HSe9t8QDygV0/w==} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@types/json-schema': ^7.0.15 + peerDependenciesMeta: + '@types/json-schema': + optional: true + + '@typescript-eslint/eslint-plugin@8.12.2': + resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.16.0': - resolution: {integrity: sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.12.2': + resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.16.0': - resolution: {integrity: sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.12.2': + resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.16.0': - resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.12.2': + resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.16.0': - resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.12.2': + resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.16.0': - resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.12.2': + resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.16.0': - resolution: {integrity: sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.12.2': + resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@7.16.0': - resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.12.2': + resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vinejs/compiler@2.5.0': resolution: {integrity: sha512-hg4ekaB5Y2zh+IWzBiC/WCDWrIfpVnKu/ubUvelKlidc/VbulsexoFRw5kJGHZenPVI5YzNnDeTdYSALkTV7jQ==} @@ -1405,18 +1557,18 @@ packages: resolution: {integrity: sha512-Qq3XxbA26jzqS9ICifkqzT399lMQZ2fWtqeV3luI2as+UIK7qDifJFU2Q4W3q3IB5VXoWxgwAZSZEO0em9I/qQ==} engines: {node: '>=18.16.0'} - '@vite-pwa/assets-generator@0.2.4': - resolution: {integrity: sha512-DXyPLPR/IpbZPSpo1amZEPghY/ziIwpTUKNaz0v1xG+ELzCXmrVQhVzEMqr2JLSqRxjc+UzKfGJA/YdUuaao3w==} + '@vite-pwa/assets-generator@0.2.6': + resolution: {integrity: sha512-kK44dXltvoubEo5B+6tCGjUrOWOE1+dA4DForbFpO1rKy2wSkAVGrs8tyfN6DzTig89/QKyV8XYodgmaKyrYng==} engines: {node: '>=16.14.0'} hasBin: true - '@vite-pwa/sveltekit@0.6.0': - resolution: {integrity: sha512-vCVNDoWXavM//6/YlkzIRFPna+WxaoEfr8948rs/Cw5iKdOiell8Hq2A9vnUVY3+0KIf+fwgfjSGTVwMXpGvwg==} + '@vite-pwa/sveltekit@0.6.6': + resolution: {integrity: sha512-f08xlcfZyaXgytl05hUtCLih7Vr8zOk/E4eE/UK71M+sEGk+y+vUyTuR8td8KQalpf1Begb8XkxAkV7iUj2a0g==} engines: {node: '>=16.14 || >=18.13'} peerDependencies: '@sveltejs/kit': ^1.3.1 || ^2.0.1 - '@vite-pwa/assets-generator': ^0.2.4 - vite-plugin-pwa: '>=0.20.0 <1' + '@vite-pwa/assets-generator': ^0.2.6 + vite-plugin-pwa: '>=0.20.5 <1' peerDependenciesMeta: '@vite-pwa/assets-generator': optional: true @@ -1434,25 +1586,29 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -1490,8 +1646,8 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arktype@2.0.0-dev.21: - resolution: {integrity: sha512-dgHCjb3FK4BGvG2LuXqgdWXstbFmiYowSy0jiKnyk4KVcMT5DyIJ9d1nbQM3ztiAL3hIPmPdkmpfxUqR+BoOBQ==} + arktype@2.0.0-rc.8: + resolution: {integrity: sha512-ByrqjptsavUCUL9ptts6BUL2LCNkVZyniOdaBw76dlBQ6gYIhYSeycuuj4gRFwcAafszOnAPD2fAqHK7bbo/Zw==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -1503,10 +1659,6 @@ packages: array-source@0.0.4: resolution: {integrity: sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} @@ -1514,12 +1666,15 @@ packages: async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1576,8 +1731,8 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - bits-ui@0.21.12: - resolution: {integrity: sha512-Cf0iB+ZKwA0ZjkpixrhrZK9PC6pGPFleW/65Xc/z0lpGvWaFtdOhiYEntCHHxZ0VihP3aJaG0OBhUBIbmAePaA==} + bits-ui@0.21.16: + resolution: {integrity: sha512-XFZ7/bK7j/K+5iktxX/ZpmoFHjYjpPzP5EOO/4bWiaFg5TG1iMcfjDhlBTQnJxD6BoVoHuqeZPHZvaTgF4Iv3Q==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.118 @@ -1590,22 +1745,15 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1636,8 +1784,11 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + canvas-confetti@1.9.3: + resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1655,12 +1806,19 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} @@ -1682,6 +1840,10 @@ packages: code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + codsen-utils@1.6.4: + resolution: {integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==} + engines: {node: '>=14.18.0'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1705,6 +1867,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -1765,6 +1931,9 @@ packages: core-js-compat@3.36.1: resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} + cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -1803,6 +1972,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + culori@4.0.1: resolution: {integrity: sha512-LSnjA6HuIUOlkfKVbzi2OlToZE8OjFi667JWN9qNymXVXzGDmvuP60SSgC+e92sd7B7158f7Fy3Mb6rXS5EDPw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1914,6 +2087,10 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -1929,11 +2106,14 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1941,6 +2121,9 @@ packages: supports-color: optional: true + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decode-bmp@0.2.1: resolution: {integrity: sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==} engines: {node: '>=8.6.0'} @@ -1978,28 +2161,29 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -2007,16 +2191,23 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dvalin-data@1.0.3: + resolution: {integrity: sha512-oc9OPK3MRl198hSYct9YiEq0Qn62eCijAaNFyBgjtmFPwMolHQGfGLxtoUPJuehNm5f/Xr2w47BEtjx5+pFx6w==} + engines: {bun: ^1.1.18, npm: please-use-bun, pnpm: please-use-bun, yarn: please-use-bun} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + effect@3.9.2: + resolution: {integrity: sha512-1sx/v1HTWHTodXfzWxAFg+SCF+ACgpJVruaAMIh/NmDVvrUsf0x9PzpXvkgJUbQ1fMdmKYK//FqxeHSQ+Zxv/Q==} + ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.722: - resolution: {integrity: sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==} + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2030,21 +2221,29 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + engine.io-client@6.6.1: + resolution: {integrity: sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==} engine.io-parser@5.2.2: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.1: + resolution: {integrity: sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==} engines: {node: '>=10.2.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2072,9 +2271,6 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - es6-promise@3.3.1: - resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - esbuild-runner@2.2.2: resolution: {integrity: sha512-fRFVXcmYVmSmtYm2mL8RlUASt2TDkGh3uRcvHFOKNr/T58VrfVeKD9uT9nlgxk96u0LS0ehS/GY7Da/bXWKkhw==} hasBin: true @@ -2086,8 +2282,8 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -2110,8 +2306,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -2124,12 +2320,12 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-svelte@2.42.0: - resolution: {integrity: sha512-mHP6z0DWq97KZvoQcApZHdF9m9epcDV/ICKufeEH18Vh+8vl7S+gwt8WdUohEqKNVMuXRkbvy1suMcVvUDiOGw==} + eslint-plugin-svelte@2.46.0: + resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.181 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -2138,28 +2334,33 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.7.0: - resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -2202,6 +2403,10 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + fast-check@3.22.0: + resolution: {integrity: sha512-8HKz3qXqnHYp/VCNn2qfjHdAdcI8zcSqOyX64GOMukp7SL2bfzfeDKjSd+UyECtejccaZv3LcvZTm9YDD22iCQ==} + engines: {node: '>=8.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2221,9 +2426,20 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.2: + resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + fastq@1.17.0: resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} + fdir@6.4.0: + resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2237,10 +2453,6 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2274,6 +2486,10 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + formsnap@1.0.1: resolution: {integrity: sha512-TvU9CoLSiacW1c7wXhLiyVpyy/LBfG0CEFDbs3M3jrsxBSrkTpsuhbQ8JYKY3CNCmIhZlgxCH+Vqr7RBF9G53w==} peerDependencies: @@ -2351,9 +2567,13 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} hasBin: true glob@7.2.3: @@ -2379,10 +2599,6 @@ packages: globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2425,17 +2641,36 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} engines: {node: '>=18'} hasBin: true - i18next@23.12.1: - resolution: {integrity: sha512-l4y291ZGRgUhKuqVSiqyuU2DDzxKStlIWSaoNBR4grYmh0X+pRYbFpTMs3CnJ5ECKbOI8sQcJ3PbTUfLgPRaMA==} + i18next@23.16.4: + resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + + i@0.3.7: + resolution: {integrity: sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==} + engines: {node: '>=0.4'} ico-endec@0.1.6: resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==} @@ -2579,9 +2814,8 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} @@ -2631,9 +2865,12 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} @@ -2658,6 +2895,15 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -2673,8 +2919,8 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-to-ts@3.1.0: - resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} json-schema-traverse@0.4.1: @@ -2718,22 +2964,22 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - layercake@8.3.4: - resolution: {integrity: sha512-r5OrzTxpDp0BQm9m5kJTIzsD5o9nbOkxXTaMzce1LPTigs9PnQfvfjnsAdj/tXpe15BJaP1RVWFgnMDSghJhXw==} + layercake@8.4.0: + resolution: {integrity: sha512-ln8i6445N85jMCVjpW+ktV+It+Cc73uP3osZCHOboMLLFOYb4qARb+XMoX0Y0p7khZkM4dZwCct8BQ0KQWpuKw==} peerDependencies: svelte: 3 - 5 || >=5.0.0-next.120 typescript: ^5.0.2 - layerchart@0.43.7: - resolution: {integrity: sha512-YfVRWJtx+wgcfUn5uDmIscbHZ2LcEaxu0FU4dVeUnIufCRk+6KbIDbpkbe8yjPlHya2AFxULG3Usx1CuDdJB3Q==} + layerchart@0.54.1: + resolution: {integrity: sha512-e2rb0A9Ca4ZAAmrpxZn85K7JwW0rroBtw9Tth9oloDC4rwpubGb/q28nKc5wplxvADibSSryvOABtcaj1pOqZg==} peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -2743,14 +2989,13 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libphonenumber-js@1.11.8: + resolution: {integrity: sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -2758,13 +3003,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.2.7: - resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} engines: {node: '>=18.12.0'} hasBin: true - listr2@8.2.3: - resolution: {integrity: sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==} + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} engines: {node: '>=18.0.0'} locate-character@3.0.0: @@ -2820,19 +3065,23 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-svelte@0.408.0: - resolution: {integrity: sha512-5rJvcnHvE+K/2ebff/tKvG1FmIut01hDUaibMk6pG2Je+82TCPflVvhMvgCjP0fkM0ztj5t/ma1s5WYyketOSA==} + lucide-svelte@0.453.0: + resolution: {integrity: sha512-K+eE2ZeE00ThIEbAmZB3Hq0sVS+1ZLj+7nqtJvN0Xrh/KZnfnEChG+do80sctqXQEE+iG1dA2T+5fVcJS1awfA==} peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 @@ -2859,12 +3108,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -2875,21 +3120,21 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2905,22 +3150,18 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - mode-watcher@0.4.0: - resolution: {integrity: sha512-zuHYgY7Cq4NAB1JHj0NpxTKfx6RMH3A2yAoDfjF1UTaIbgWzRyCQRcK/uE9EuVt2PqAGZZbqxRC0h9eB1hfyJQ==} + mode-watcher@0.4.1: + resolution: {integrity: sha512-bNC+1NXmwEFZtziCdZSgP7HFQTpqJPcQn9GwwJQGSf6SBF3neEPYV1uRwkYuAQwbsvsXIYtzaqgedDzJ7D1mhg==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.1 @@ -2970,8 +3211,11 @@ packages: node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -2989,6 +3233,9 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nwsapi@2.2.13: + resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3011,14 +3258,14 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3039,6 +3286,9 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3047,6 +3297,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3070,33 +3323,37 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} path-source@0.1.3: resolution: {integrity: sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -3178,12 +3435,12 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.147.0: - resolution: {integrity: sha512-cALKIcix1W9xMsfUUI/QUFhtBeabDGsQCb3lpZEFd7WCPNLOcGmpeomm4xMX7MO2OnfK6Ov91/HNyfK1wncjSA==} + posthog-js@1.176.0: + resolution: {integrity: sha512-T5XKNtRzp7q6CGb7Vc7wAI76rWap9fiuDUPxPsyPBPDkreKya91x9RIsSapAVFafwD1AEin1QMczCmt9Le9BWw==} preact@10.19.5: resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} @@ -3201,8 +3458,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-svelte@3.2.5: - resolution: {integrity: sha512-vP/M/Goc8z4iVIvrwXwbrYVjJgA0Hf8PO1G4LBh/ocSt6vUP6sLvyu9F3ABEGr+dbKyxZjEKLkeFsWy/yYl0HQ==} + prettier-plugin-svelte@3.2.7: + resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 @@ -3245,6 +3502,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3254,6 +3514,22 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + ranges-apply@7.0.16: + resolution: {integrity: sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==} + engines: {node: '>=14.18.0'} + + ranges-merge@9.0.15: + resolution: {integrity: sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==} + engines: {node: '>=14.18.0'} + + ranges-push@7.0.15: + resolution: {integrity: sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==} + engines: {node: '>=14.18.0'} + + ranges-sort@6.0.11: + resolution: {integrity: sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==} + engines: {node: '>=14.18.0'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -3269,6 +3545,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.1: + resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + engines: {node: '>= 14.16.0'} + regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -3318,9 +3598,9 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -3329,16 +3609,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup-plugin-svelte@7.1.6: - resolution: {integrity: sha512-nVFRBpGWI2qUY1OcSiEEA/kjCY2+vAjO9BI8SzA7NRrh2GTunLd6w2EYmnMt/atgdg8GvcNjLsmZmbQs/u4SQA==} + rollup-plugin-svelte@7.2.2: + resolution: {integrity: sha512-hgnIblTRewaBEVQD6N0Q43o+y6q1TmDRhBjaEzQCi50bs8TXqjc+d1zFZyE8tsfgcfNHZQzclh4RxlFUB85H8Q==} engines: {node: '>=10'} peerDependencies: rollup: '>=2.0.0' @@ -3355,11 +3630,14 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.14.1: - resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3381,17 +3659,22 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sander@0.5.1: - resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - - sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + sass@1.80.4: + resolution: {integrity: sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==} engines: {node: '>=14.0.0'} hasBin: true + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3438,9 +3721,6 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3451,16 +3731,16 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-icons@13.15.0: + resolution: {integrity: sha512-8SzFj9CvPlDnjDLISsAWTvpCs7om2zbSJZ1hNLRo6quWKLqFwjCD9opS24Q/yD0bdsnVHPpF0N3hitpHrY5u9w==} + engines: {node: '>=0.12.18'} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} @@ -3476,24 +3756,20 @@ packages: socket.io-adapter@2.5.4: resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} - hasBin: true - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -3525,6 +3801,22 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-collapse-leading-whitespace@7.0.7: + resolution: {integrity: sha512-jF9eynJoE6ezTCdYI8Qb02/ij/DlU9ItG93Dty4SWfJeLFrotOr+wH9IRiWHTqO3mjCyqBWEiU3uSTIbxYbAEQ==} + engines: {node: '>=14.18.0'} + + string-left-right@6.0.17: + resolution: {integrity: sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==} + engines: {node: '>=14.18.0'} + + string-strip-html@13.4.8: + resolution: {integrity: sha512-vlcRAtx5DN6zXGUx3EYGFg0/JOQWM65mqLgDaBHviQPP+ovUFzqZ30iQ+674JHWr9wNgnzFGxx9TGipPZMnZXg==} + engines: {node: '>=14.18.0'} + + string-trim-spaces-only@5.0.10: + resolution: {integrity: sha512-MhmjE5jNqb1Ylo+BARPRlsdChGLrnPpAUWrT1VOxo9WhWwKVUU6CbZTfjwKaQPYTGS/wsX/4Zek88FM2rEb5iA==} + engines: {node: '>=14.18.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3575,10 +3867,6 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3608,30 +3896,23 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - sveld@0.20.0: - resolution: {integrity: sha512-PQRs0evdOjsFzjHuPu8B/flqbJX2osN2D0++6nl77jhwriQazaEF0pkQAMwPRaSn/kMivvUdWkkPKi1NmHLosg==} + sveld@0.20.2: + resolution: {integrity: sha512-pd/RZ4TR7oaX6XphE8uhwAjKIVw1lg19aysYM5lYpD97AthlAJD8kSEgtEXHXw6xFYXsfnhrj0XxGHnbKFsnlA==} hasBin: true - svelte-check@3.8.4: - resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==} + svelte-check@4.0.5: + resolution: {integrity: sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ==} + engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: - svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - - svelte-eslint-parser@0.39.2: - resolution: {integrity: sha512-87UwLuWTtDIuzWOhOi1zBL5wYVd07M5BK1qZ57YmXJB5/UmjUNJqGy3XSOhPqjckY1dATNV9y+mx+nI0WH6HPA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 - peerDependenciesMeta: - svelte: - optional: true + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' - svelte-eslint-parser@0.40.0: - resolution: {integrity: sha512-M+v1HhC5T1WKYVxWexUCS4o6oIBS88XKzOZuhl2ew+eGxol7eC21e+VE8TC4rXJ3iT3iXT0qlZsZcpKjVo5/zQ==} + svelte-eslint-parser@0.43.0: + resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.181 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -3658,6 +3939,11 @@ packages: peerDependencies: svelte: ^4.0.0 + svelte-legos@0.2.5: + resolution: {integrity: sha512-r4HbLYripCLECgraqJMvsykW/8FaPBd1hLkt3ejJzJRfhhOnCgGTo6lJT27qrestDFbiIASQV3xOnjRr/D6cGw==} + peerDependencies: + svelte: ^4.0.0 + svelte-lucide@1.0.6: resolution: {integrity: sha512-p3KmG59dr7Xwm4gKnWG/flbukF5X6FP9W7FnK0fhigaKyBKAWmHlMJ4peFwxDOuQ/k3Ssl8ngLiDqAUxLX8dyA==} peerDependencies: @@ -3669,21 +3955,21 @@ packages: peerDependencies: svelte: ^3.48.0 || ^4.0.0 || ^5.0.0-next.0 - svelte-preprocess@5.1.3: - resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} - engines: {node: '>= 16.0.0', pnpm: ^8.0.0} + svelte-preprocess@6.0.3: + resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} + engines: {node: '>= 18.0.0'} peerDependencies: '@babel/core': ^7.10.2 coffeescript: ^2.5.1 less: ^3.11.3 || ^4.0.0 postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + postcss-load-config: '>=3' pug: ^3.0.0 sass: ^1.26.8 - stylus: ^0.55.0 + stylus: '>=0.55' sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 - svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0 + typescript: ^5.0.0 peerDependenciesMeta: '@babel/core': optional: true @@ -3711,8 +3997,8 @@ packages: peerDependencies: svelte: ^4.0.0 - svelte-sonner@0.3.27: - resolution: {integrity: sha512-+PvbuePNTyTNCepCWqKcFeu+Lo27yYuwfSc7zJvrWjCRMJrWAmccPg3j7jO1W13QoN3TySXU5Trb956VBQiM5Q==} + svelte-sonner@0.3.28: + resolution: {integrity: sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 @@ -3721,35 +4007,33 @@ packages: peerDependencies: svelte: ^4.0.0 - svelte-ux@0.72.4: - resolution: {integrity: sha512-P0wFF/vIdq7VMdAt/ajZpwU0p0Y9oNcZc1hJuPrdcv5F2o5VKqO3bbpUTdh3WIMeHPDjBI8FKfKHQK4t7TdTHg==} - peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 - - svelte-ux@0.73.2: - resolution: {integrity: sha512-JaLj0qh+KEeH3Yyd/YoWyAlo1lozDzz+jjLpjLV81Ni1/ya1QJFAgQasTl0TPHfJdFtSsv2yel/bo3Sy4TCmHA==} + svelte-ux@0.75.1: + resolution: {integrity: sha512-aeDwmkM2+Fn4asKtiiMdX79LqLtvikFwFg+4UI4sc7oJSUwC6+9DjLdxyqWfxk2F/VtzeCFI+AJtzhp1wVl7DQ==} peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 - svelte@4.2.18: - resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==} + svelte@4.2.19: + resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - sveltekit-superforms@2.16.0: - resolution: {integrity: sha512-t5aZyMCXyahgvn7VAJ7l9S+wAv9YyMAZHYQ6gcGVZ6ecr4/DMMD2r3ajGCj1h1dWaMQ3w5zVw+SqHSAkbHsWVQ==} + sveltekit-superforms@2.20.0: + resolution: {integrity: sha512-5HyA6THKFBHEmJinZ/klu2/0jYr9ElSaXMYc5EO9ptP3x1wQPWVXYl59sMcaSrIjWUlPpayGxVppCyu+x/o4WA==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.4.0: - resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + tailwind-merge@2.5.4: + resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} tailwind-variants@0.2.1: resolution: {integrity: sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==} @@ -3757,8 +4041,8 @@ packages: peerDependencies: tailwindcss: '*' - tailwindcss@3.4.4: - resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} engines: {node: '>=14.0.0'} hasBin: true @@ -3815,6 +4099,27 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinyglobby@0.2.0: + resolution: {integrity: sha512-+clyYQfAnNlt5a1x7CCQ6RLuTIztDfDAl6mAANvqRUlz6sVy5znCzJOhais8G6oyUyoeeaorLopO3HptVP8niA==} + engines: {node: '>=12.0.0'} + + tinyglobby@0.2.9: + resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} + engines: {node: '>=12.0.0'} + + tldts-core@6.1.50: + resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==} + + tldts@6.1.50: + resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==} + hasBin: true + to-data-view@1.1.0: resolution: {integrity: sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==} @@ -3837,9 +4142,17 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} @@ -3849,24 +4162,29 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-deepmerge@7.0.0: - resolution: {integrity: sha512-WZ/iAJrKDhdINv1WG6KZIGHrZDar6VfhftG1QJFpVbOYZMYJLJOvZOo1amictRXVdBXZIgBHKswMTXzElngprA==} + ts-deepmerge@7.0.1: + resolution: {integrity: sha512-JBFCmNenZdUCc+TRNCtXVM6N8y/nDQHAcpj5BlwXG/gnogjam1NunulB9ia68mnqYI446giMfpqeBFFkOleh+g==} engines: {node: '>=14.13.1'} ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-json-schema-generator@2.3.0: + resolution: {integrity: sha512-t4lBQAwZc0sOJq9LJt3NgbznIcslVnm0JeEMFq8qIRklpMRY8jlYD0YmnRWbqBKANxkby91P1XanSSlSOFpUmg==} + engines: {node: '>=18.0.0'} + hasBin: true + tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tw-colors@3.3.1: - resolution: {integrity: sha512-PH6NShNtDzPCm6zjl0SZe3kmdYSfDS7Sk4mWa9+KzaeSH1ZmpLRrBjZoBJKaFcDB3o7iuFPPg9+HtW05pGPQyQ==} + tw-colors@3.3.2: + resolution: {integrity: sha512-TosYI43Jec/KO4NPzDoBlccPPtPMYholoRUSVYGmzCGa1Zek9exDQIQ+6UViHqqK6Nti/4wBzEGyRTxMSNnSXQ==} peerDependencies: tailwindcss: '>=3.0.0' @@ -3898,18 +4216,17 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript-eslint@7.16.0: - resolution: {integrity: sha512-kaVRivQjOzuoCXU6+hLnjo3/baxyzWVO5GrnExkFzETRYJKVHYkrJglOu2OCm8Hi9RPDWX1PTNNTpU5KRV0+RA==} - engines: {node: ^18.18.0 || >=20.0.0} + typescript-eslint@8.12.2: + resolution: {integrity: sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -3957,8 +4274,8 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3972,8 +4289,13 @@ packages: valibot@0.31.1: resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==} - valibot@0.35.0: - resolution: {integrity: sha512-+i2aCRkReTrd5KBN/dW2BrPOvFnU5LXTV2xjZnjnqUIO8YUx6P2+MgRrkwF2FhkexgyKq/NIZdPdknhHf5A/Ww==} + valibot@0.41.0: + resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} @@ -3983,11 +4305,16 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-plugin-pwa@0.20.0: - resolution: {integrity: sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==} + vaul-svelte@0.3.2: + resolution: {integrity: sha512-X4OGWttSTVUl417qGDsSFgOvIx24DoiMRY/jaP9z0v9FL8LQQJ0RQ1ZM0QpdyQPRlNd24ewjNQHh5EgYDtfNpw==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.1 + + vite-plugin-pwa@0.20.5: + resolution: {integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==} engines: {node: '>=16.0.0'} peerDependencies: - '@vite-pwa/assets-generator': ^0.2.4 + '@vite-pwa/assets-generator': ^0.2.6 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 workbox-build: ^7.1.0 workbox-window: ^7.1.0 @@ -3995,8 +4322,8 @@ packages: '@vite-pwa/assets-generator': optional: true - vite@5.3.3: - resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==} + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4004,6 +4331,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -4016,6 +4344,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -4031,12 +4361,32 @@ packages: vite: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + web-vitals@4.2.1: resolution: {integrity: sha512-U6bAxeudnhDqcXNl50JC4hLlqox9DZnngxfISZm3DMZnonW35xtJOVUc091L+DOY+6hVZVpKXoiCP0RiT6339Q==} webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -4129,8 +4479,39 @@ packages: utf-8-validate: optional: true - xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xmlhttprequest-ssl@2.1.1: + resolution: {integrity: sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==} engines: {node: '>=0.4.0'} y18n@5.0.8: @@ -4144,12 +4525,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} hasBin: true @@ -4172,8 +4549,8 @@ packages: yup@1.4.0: resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} - zod-to-json-schema@3.23.1: - resolution: {integrity: sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw==} + zod-to-json-schema@3.23.3: + resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 @@ -4193,25 +4570,25 @@ snapshots: '@antfu/utils@0.7.7': {} - '@apideck/better-ajv-errors@0.3.6(ajv@8.12.0)': + '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': dependencies: - ajv: 8.12.0 + ajv: 8.17.1 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - '@arktype/schema@0.1.13': + '@ark/schema@0.10.0': dependencies: - '@arktype/util': 0.0.48 + '@ark/util': 0.10.0 optional: true - '@arktype/util@0.0.48': + '@ark/util@0.10.0': optional: true '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 - picocolors: 1.0.0 + picocolors: 1.1.0 '@babel/compat-data@7.24.1': {} @@ -4228,7 +4605,7 @@ snapshots: '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.6 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4254,7 +4631,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -4283,7 +4660,7 @@ snapshots: '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - debug: 4.3.4 + debug: 4.3.6 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -4374,7 +4751,7 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.1.0 '@babel/parser@7.24.1': dependencies: @@ -4899,7 +5276,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - debug: 4.3.4 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4912,66 +5289,66 @@ snapshots: '@canvas/image-data@1.0.0': {} - '@commitlint/cli@19.3.0(@types/node@20.11.30)(typescript@5.5.3)': + '@commitlint/cli@19.5.0(@types/node@20.11.30)(typescript@5.6.3)': dependencies: - '@commitlint/format': 19.3.0 - '@commitlint/lint': 19.2.2 - '@commitlint/load': 19.2.0(@types/node@20.11.30)(typescript@5.5.3) - '@commitlint/read': 19.2.1 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@20.11.30)(typescript@5.6.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@19.2.2': + '@commitlint/config-conventional@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@19.0.3': + '@commitlint/config-validator@19.5.0': dependencies: - '@commitlint/types': 19.0.3 - ajv: 8.12.0 + '@commitlint/types': 19.5.0 + ajv: 8.17.1 - '@commitlint/ensure@19.0.3': + '@commitlint/ensure@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@19.0.0': {} + '@commitlint/execute-rule@19.5.0': {} - '@commitlint/format@19.3.0': + '@commitlint/format@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 chalk: 5.3.0 - '@commitlint/is-ignored@19.2.2': + '@commitlint/is-ignored@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 semver: 7.6.2 - '@commitlint/lint@19.2.2': + '@commitlint/lint@19.5.0': dependencies: - '@commitlint/is-ignored': 19.2.2 - '@commitlint/parse': 19.0.3 - '@commitlint/rules': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/load@19.2.0(@types/node@20.11.30)(typescript@5.5.3)': + '@commitlint/load@19.5.0(@types/node@20.11.30)(typescript@5.6.3)': dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.5.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3) + cosmiconfig: 9.0.0(typescript@5.6.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -4979,50 +5356,55 @@ snapshots: - '@types/node' - typescript - '@commitlint/message@19.0.0': {} + '@commitlint/message@19.5.0': {} - '@commitlint/parse@19.0.3': + '@commitlint/parse@19.5.0': dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@19.2.1': + '@commitlint/read@19.5.0': dependencies: - '@commitlint/top-level': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 git-raw-commits: 4.0.0 minimist: 1.2.8 + tinyexec: 0.3.0 - '@commitlint/resolve-extends@19.1.0': + '@commitlint/resolve-extends@19.5.0': dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 global-directory: 4.0.1 import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@19.0.3': + '@commitlint/rules@19.5.0': dependencies: - '@commitlint/ensure': 19.0.3 - '@commitlint/message': 19.0.0 - '@commitlint/to-lines': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/to-lines@19.0.0': {} + '@commitlint/to-lines@19.5.0': {} - '@commitlint/top-level@19.0.0': + '@commitlint/top-level@19.5.0': dependencies: find-up: 7.0.0 - '@commitlint/types@19.0.3': + '@commitlint/types@19.5.0': dependencies: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 + '@effect/schema@0.75.5(effect@3.9.2)': + dependencies: + effect: 3.9.2 + fast-check: 3.22.0 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -5092,28 +5474,28 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@1.21.0))': dependencies: - eslint: 9.7.0 + eslint: 9.13.0(jiti@1.21.0) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} - '@eslint-community/regexpp@4.11.0': {} - '@eslint/config-array@0.17.0': + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.4 + debug: 4.3.6 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + '@eslint/core@0.7.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.4 - espree: 10.1.0 + debug: 4.3.6 + espree: 10.2.0 globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 @@ -5123,25 +5505,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.7.0': {} + '@eslint/js@9.13.0': {} '@eslint/object-schema@2.1.4': {} + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 + '@exodus/schemasafe@1.3.0': optional: true '@floating-ui/core@1.6.0': dependencies: - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.7': + '@floating-ui/dom@1.6.10': dependencies: '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils': 0.2.7 - '@floating-ui/utils@0.2.4': {} + '@floating-ui/dom@1.6.11': + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.8 - '@fortawesome/fontawesome-common-types@6.5.2': {} + '@floating-ui/utils@0.2.7': {} + + '@floating-ui/utils@0.2.8': {} + + '@fortawesome/fontawesome-common-types@6.6.0': {} '@gcornut/valibot-json-schema@0.31.0': dependencies: @@ -5160,11 +5553,18 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': + dependencies: + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} - '@internationalized/date@3.5.4': + '@internationalized/date@3.5.6': dependencies: '@swc/helpers': 0.5.3 @@ -5199,17 +5599,54 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@layerstack/svelte-actions@0.0.7': + dependencies: + '@floating-ui/dom': 1.6.11 + '@layerstack/utils': 0.0.5 + d3-array: 3.2.4 + d3-scale: 4.0.2 + date-fns: 4.1.0 + lodash-es: 4.17.21 + + '@layerstack/svelte-stores@0.0.6': + dependencies: + '@layerstack/utils': 0.0.5 + d3-array: 3.2.4 + date-fns: 4.1.0 + immer: 10.1.1 + lodash-es: 4.17.21 + zod: 3.23.8 + + '@layerstack/tailwind@0.0.9': + dependencies: + '@layerstack/utils': 0.0.5 + clsx: 2.1.1 + culori: 4.0.1 + d3-array: 3.2.4 + date-fns: 4.1.0 + lodash-es: 4.17.21 + tailwind-merge: 2.5.4 + tailwindcss: 3.4.14 + transitivePeerDependencies: + - ts-node + + '@layerstack/utils@0.0.5': + dependencies: + d3-array: 3.2.4 + date-fns: 4.1.0 + lodash-es: 4.17.21 + '@mdi/js@7.4.47': {} - '@melt-ui/svelte@0.76.2(svelte@4.2.18)': + '@melt-ui/svelte@0.76.2(svelte@4.2.19)': dependencies: '@floating-ui/core': 1.6.0 - '@floating-ui/dom': 1.6.7 - '@internationalized/date': 3.5.4 + '@floating-ui/dom': 1.6.10 + '@internationalized/date': 3.5.6 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.6 - svelte: 4.2.18 + nanoid: 5.0.7 + svelte: 4.2.19 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5223,6 +5660,62 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.0 + '@parcel/watcher-android-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-x64@2.4.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.4.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.4.1': + optional: true + + '@parcel/watcher-win32-arm64@2.4.1': + optional: true + + '@parcel/watcher-win32-ia32@2.4.1': + optional: true + + '@parcel/watcher-win32-x64@2.4.1': + optional: true + + '@parcel/watcher@2.4.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -5278,49 +5771,52 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/rollup-android-arm-eabi@4.14.1': + '@rollup/rollup-android-arm-eabi@4.21.2': + optional: true + + '@rollup/rollup-android-arm64@4.21.2': optional: true - '@rollup/rollup-android-arm64@4.14.1': + '@rollup/rollup-darwin-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-arm64@4.14.1': + '@rollup/rollup-darwin-x64@4.21.2': optional: true - '@rollup/rollup-darwin-x64@4.14.1': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.14.1': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.14.1': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.14.1': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.14.1': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.14.1': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.14.1': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-musl@4.14.1': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.14.1': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.14.1': + '@rollup/rollup-win32-ia32-msvc@4.21.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.14.1': + '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true '@sideway/address@4.1.5': @@ -5334,14 +5830,11 @@ snapshots: '@sideway/pinpoint@2.0.0': optional: true - '@sinclair/typebox@0.32.34': + '@sinclair/typebox@0.32.35': optional: true '@socket.io/component-emitter@3.1.2': {} - '@sodaru/yup-to-json-schema@2.0.1': - optional: true - '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.9 @@ -5349,16 +5842,16 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.11 - '@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))': + '@sveltejs/adapter-static@3.0.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) - '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))': + '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 5.0.0 + devalue: 5.1.1 esm-env: 1.0.0 import-meta-resolve: 4.1.0 kleur: 4.1.5 @@ -5366,44 +5859,44 @@ snapshots: mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 - sirv: 2.0.4 - svelte: 4.2.18 + sirv: 3.0.0 + svelte: 4.2.19 tiny-glob: 0.2.9 - vite: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) + vite: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) - debug: 4.3.4 - svelte: 4.2.18 - vite: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) + debug: 4.3.6 + svelte: 4.2.19 + vite: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))': + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) - debug: 4.3.4 + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) + debug: 4.3.6 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 - svelte: 4.2.18 - svelte-hmr: 0.16.0(svelte@4.2.18) - vite: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) - vitefu: 0.2.5(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + svelte: 4.2.19 + svelte-hmr: 0.16.0(svelte@4.2.19) + vite: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) + vitefu: 0.2.5(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) transitivePeerDependencies: - supports-color '@swc/helpers@0.5.3': dependencies: - tslib: 2.6.3 + tslib: 2.8.0 - '@tanstack/query-core@5.51.1': {} + '@tanstack/query-core@5.59.16': {} - '@tanstack/svelte-query@5.51.1(svelte@4.2.18)': + '@tanstack/svelte-query@5.59.16(svelte@4.2.19)': dependencies: - '@tanstack/query-core': 5.51.1 - svelte: 4.2.18 + '@tanstack/query-core': 5.59.16 + svelte: 4.2.19 '@types/conventional-commits-parser@5.0.0': dependencies: @@ -5429,7 +5922,7 @@ snapshots: '@types/d3-time@3.0.3': {} - '@types/eslint@8.56.10': + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -5438,14 +5931,20 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/json-schema@7.0.15': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.10 + + '@types/lodash@4.17.10': {} + '@types/node@20.11.30': dependencies: undici-types: 5.26.5 - '@types/pug@2.0.10': {} - '@types/resolve@1.17.1': dependencies: '@types/node': 20.11.30 @@ -5455,85 +5954,99 @@ snapshots: '@types/validator@13.12.0': optional: true - '@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)': + '@typeschema/class-validator@0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.0 - '@typescript-eslint/type-utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.0 - eslint: 9.7.0 + '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) + optionalDependencies: + class-validator: 0.14.1 + transitivePeerDependencies: + - '@types/json-schema' + optional: true + + '@typeschema/core@0.14.0(@types/json-schema@7.0.15)': + optionalDependencies: + '@types/json-schema': 7.0.15 + optional: true + + '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/type-utils': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 + eslint: 9.13.0(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.16.0(eslint@9.7.0)(typescript@5.5.3)': + '@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 7.16.0 - '@typescript-eslint/types': 7.16.0 - '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.0 - debug: 4.3.4 - eslint: 9.7.0 + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 + debug: 4.3.6 + eslint: 9.13.0(jiti@1.21.0) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.16.0': + '@typescript-eslint/scope-manager@8.12.2': dependencies: - '@typescript-eslint/types': 7.16.0 - '@typescript-eslint/visitor-keys': 7.16.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 - '@typescript-eslint/type-utils@7.16.0(eslint@9.7.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - debug: 4.3.4 - eslint: 9.7.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.16.0': {} + '@typescript-eslint/types@8.12.2': {} - '@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.16.0 - '@typescript-eslint/visitor-keys': 7.16.0 - debug: 4.3.4 - globby: 11.1.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 + debug: 4.3.6 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.16.0(eslint@9.7.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@typescript-eslint/scope-manager': 7.16.0 - '@typescript-eslint/types': 7.16.0 - '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) - eslint: 9.7.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.0)) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + eslint: 9.13.0(jiti@1.21.0) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.16.0': + '@typescript-eslint/visitor-keys@8.12.2': dependencies: - '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/types': 8.12.2 eslint-visitor-keys: 3.4.3 '@vinejs/compiler@2.5.0': @@ -5551,7 +6064,7 @@ snapshots: validator: 13.12.0 optional: true - '@vite-pwa/assets-generator@0.2.4': + '@vite-pwa/assets-generator@0.2.6': dependencies: cac: 6.7.14 colorette: 2.0.20 @@ -5560,13 +6073,14 @@ snapshots: sharp-ico: 0.1.5 unconfig: 0.3.11 - '@vite-pwa/sveltekit@0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0))': + '@vite-pwa/sveltekit@0.6.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.20.5(@vite-pwa/assets-generator@0.2.6)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) kolorist: 1.8.0 - vite-plugin-pwa: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0) + tinyglobby: 0.2.9 + vite-plugin-pwa: 0.20.5(@vite-pwa/assets-generator@0.2.6)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0) optionalDependencies: - '@vite-pwa/assets-generator': 0.2.4 + '@vite-pwa/assets-generator': 0.2.6 JSONStream@1.3.5: dependencies: @@ -5578,17 +6092,19 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.12.0): - dependencies: - acorn: 8.12.0 + acorn@8.12.0: {} - acorn@8.11.3: {} + acorn@8.12.1: {} - acorn@8.12.0: {} + agent-base@7.1.1: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color ajv@6.12.6: dependencies: @@ -5597,14 +6113,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - ansi-escapes@6.2.1: {} + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 ansi-regex@5.0.1: {} @@ -5635,10 +6153,10 @@ snapshots: dependencies: dequal: 2.0.3 - arktype@2.0.0-dev.21: + arktype@2.0.0-rc.8: dependencies: - '@arktype/schema': 0.1.13 - '@arktype/util': 0.0.48 + '@ark/schema': 0.10.0 + '@ark/util': 0.10.0 optional: true array-buffer-byte-length@1.0.1: @@ -5650,8 +6168,6 @@ snapshots: array-source@0.0.4: {} - array-union@2.1.0: {} - arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -5665,16 +6181,18 @@ snapshots: async@3.2.5: {} + asynckit@0.4.0: {} + at-least-node@1.0.0: {} - autoprefixer@10.4.19(postcss@8.4.39): + autoprefixer@10.4.20(postcss@8.4.47): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001600 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.39 + picocolors: 1.0.1 + postcss: 8.4.47 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -5738,12 +6256,12 @@ snapshots: binary-extensions@2.2.0: {} - bits-ui@0.21.12(svelte@4.2.18): + bits-ui@0.21.16(svelte@4.2.19): dependencies: - '@internationalized/date': 3.5.4 - '@melt-ui/svelte': 0.76.2(svelte@4.2.18) - nanoid: 5.0.6 - svelte: 4.2.18 + '@internationalized/date': 3.5.6 + '@melt-ui/svelte': 0.76.2(svelte@4.2.19) + nanoid: 5.0.7 + svelte: 4.2.19 bl@4.1.0: dependencies: @@ -5760,22 +6278,16 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.23.0: + browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.722 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - - buffer-crc32@0.2.13: {} + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) buffer-from@1.1.2: {} @@ -5803,7 +6315,9 @@ snapshots: camelcase@8.0.0: optional: true - caniuse-lite@1.0.30001600: {} + caniuse-lite@1.0.30001651: {} + + canvas-confetti@1.9.3: {} chalk@2.4.2: dependencies: @@ -5830,11 +6344,22 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.0.1 + chownr@1.1.4: {} - cli-cursor@4.0.0: + class-validator@0.14.1: dependencies: - restore-cursor: 4.0.0 + '@types/validator': 13.12.0 + libphonenumber-js: 1.11.8 + validator: 13.12.0 + optional: true + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 cli-truncate@4.0.0: dependencies: @@ -5849,20 +6374,24 @@ snapshots: clsx@2.1.1: {} - cmdk-sv@0.0.18(svelte@4.2.18): + cmdk-sv@0.0.18(svelte@4.2.19): dependencies: - bits-ui: 0.21.12(svelte@4.2.18) + bits-ui: 0.21.16(svelte@4.2.19) nanoid: 5.0.7 - svelte: 4.2.18 + svelte: 4.2.19 code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.5 - acorn: 8.11.3 + '@types/estree': 1.0.6 + acorn: 8.12.0 estree-walker: 3.0.3 periscopic: 3.1.0 + codsen-utils@1.6.4: + dependencies: + rfdc: 1.4.1 + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5887,6 +6416,10 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@12.1.0: {} commander@2.20.3: {} @@ -5931,28 +6464,30 @@ snapshots: core-js-compat@3.36.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 + + core-js@3.38.1: {} cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.30)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): dependencies: '@types/node': 20.11.30 - cosmiconfig: 9.0.0(typescript@5.5.3) + cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.0 - typescript: 5.5.3 + typescript: 5.6.3 - cosmiconfig@9.0.0(typescript@5.5.3): + cosmiconfig@9.0.0(typescript@5.6.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 cross-spawn@7.0.3: dependencies: @@ -5965,10 +6500,14 @@ snapshots: css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 cssesc@3.0.0: {} + cssstyle@4.1.0: + dependencies: + rrweb-cssom: 0.7.1 + culori@4.0.1: {} d3-array@2.12.1: @@ -6073,6 +6612,11 @@ snapshots: dargs@8.1.0: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -6093,13 +6637,17 @@ snapshots: date-fns@3.6.0: {} + date-fns@4.1.0: {} + dayjs@1.11.11: optional: true - debug@4.3.4: + debug@4.3.6: dependencies: ms: 2.1.2 + decimal.js@10.4.3: {} + decode-bmp@0.2.1: dependencies: '@canvas/image-data': 1.0.0 @@ -6139,33 +6687,48 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + dequal@2.0.3: {} - detect-indent@6.1.0: {} + detect-libc@1.0.3: {} detect-libc@2.0.2: {} - devalue@5.0.0: {} + devalue@5.1.1: {} didyoumean@1.2.2: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dlv@1.1.3: {} dot-prop@5.3.0: dependencies: is-obj: 2.0.0 + dvalin-data@1.0.3: + dependencies: + ajv: 8.17.1 + glob: 11.0.0 + i: 0.3.7 + jsdom: 25.0.1 + string-strip-html: 13.4.8 + ts-json-schema-generator: 2.3.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + eastasianwidth@0.2.0: {} + effect@3.9.2: + optional: true + ejs@3.1.9: dependencies: jake: 10.8.7 - electron-to-chromium@1.4.722: {} + electron-to-chromium@1.5.5: {} emoji-regex@10.3.0: {} @@ -6177,13 +6740,13 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.5.3: + engine.io-client@6.6.1: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + debug: 4.3.6 engine.io-parser: 5.2.2 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.1 transitivePeerDependencies: - bufferutil - supports-color @@ -6191,7 +6754,7 @@ snapshots: engine.io-parser@5.2.2: {} - engine.io@6.5.4: + engine.io@6.6.1: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 @@ -6200,16 +6763,20 @@ snapshots: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.6 engine.io-parser: 5.2.2 - ws: 8.11.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate + entities@4.5.0: {} + env-paths@2.2.1: {} + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -6285,8 +6852,6 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - es6-promise@3.3.1: {} - esbuild-runner@2.2.2(esbuild@0.21.5): dependencies: esbuild: 0.21.5 @@ -6320,47 +6885,47 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.1: {} + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.7.0): + eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@1.21.0)): dependencies: - eslint: 9.7.0 + eslint: 9.13.0(jiti@1.21.0) semver: 7.6.2 - eslint-config-prettier@9.1.0(eslint@9.7.0): + eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.0)): dependencies: - eslint: 9.7.0 + eslint: 9.13.0(jiti@1.21.0) - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.7.0))(eslint@9.7.0)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.0)))(eslint@9.13.0(jiti@1.21.0))(prettier@3.3.3): dependencies: - eslint: 9.7.0 + eslint: 9.13.0(jiti@1.21.0) prettier: 3.3.3 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 + synckit: 0.9.1 optionalDependencies: - '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@9.7.0) + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@1.21.0)) - eslint-plugin-svelte@2.42.0(eslint@9.7.0)(svelte@4.2.18): + eslint-plugin-svelte@2.46.0(eslint@9.13.0(jiti@1.21.0))(svelte@4.2.19): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.0)) '@jridgewell/sourcemap-codec': 1.4.15 - eslint: 9.7.0 - eslint-compat-utils: 0.5.1(eslint@9.7.0) + eslint: 9.13.0(jiti@1.21.0) + eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.0)) esutils: 2.0.3 - known-css-properties: 0.34.0 - postcss: 8.4.39 - postcss-load-config: 3.1.4(postcss@8.4.39) - postcss-safe-parser: 6.0.0(postcss@8.4.39) + known-css-properties: 0.35.0 + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47) + postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.1.0 semver: 7.6.2 - svelte-eslint-parser: 0.40.0(svelte@4.2.18) + svelte-eslint-parser: 0.43.0(svelte@4.2.19) optionalDependencies: - svelte: 4.2.18 + svelte: 4.2.19 transitivePeerDependencies: - ts-node @@ -6369,33 +6934,37 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.0.2: + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.1.0: {} - eslint@9.7.0: + eslint@9.13.0(jiti@1.21.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.0)) '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.0 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.7.0 + '@eslint/js': 9.13.0 + '@eslint/plugin-kit': 0.2.0 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6405,30 +6974,29 @@ snapshots: ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.0 transitivePeerDependencies: - supports-color esm-env@1.0.0: {} - espree@10.1.0: + espree@10.2.0: dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) - eslint-visitor-keys: 4.0.0 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.1.0 espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 esquery@1.5.0: @@ -6447,7 +7015,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} @@ -6467,6 +7035,11 @@ snapshots: expand-template@2.0.3: {} + fast-check@3.22.0: + dependencies: + pure-rand: 6.1.0 + optional: true + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -6479,16 +7052,22 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.2: {} + fastq@1.17.0: dependencies: reusify: 1.0.4 + fdir@6.4.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -6503,10 +7082,6 @@ snapshots: dependencies: minimatch: 5.1.6 - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6544,11 +7119,17 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formsnap@1.0.1(svelte@4.2.18)(sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)): + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formsnap@1.0.1(svelte@4.2.19)(sveltekit-superforms@2.20.0(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@types/json-schema@7.0.15)(svelte@4.2.19)(typescript@5.6.3)): dependencies: nanoid: 5.0.6 - svelte: 4.2.18 - sveltekit-superforms: 2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18) + svelte: 4.2.19 + sveltekit-superforms: 2.20.0(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@types/json-schema@7.0.15)(svelte@4.2.19)(typescript@5.6.3) fraction.js@4.3.7: {} @@ -6617,13 +7198,23 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob@10.4.5: dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 + jackspeak: 3.4.3 minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.1.1 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 glob@7.2.3: dependencies: @@ -6648,15 +7239,6 @@ snapshots: globalyzer@0.1.0: {} - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - globrex@0.1.2: {} gopd@1.0.1: @@ -6689,14 +7271,36 @@ snapshots: dependencies: function-bind: 1.1.2 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-entities@2.5.2: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + human-signals@5.0.0: {} - husky@9.0.11: {} + husky@9.1.6: {} - i18next@23.12.1: + i18next@23.16.4: dependencies: '@babel/runtime': 7.24.1 + i@0.3.7: {} + ico-endec@0.1.6: {} iconv-lite@0.6.3: @@ -6811,11 +7415,11 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} + is-potential-custom-element-name@1.0.1: {} is-reference@3.0.2: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 is-regex@1.1.4: dependencies: @@ -6856,12 +7460,16 @@ snapshots: isexe@2.0.0: {} - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.8.7: dependencies: async: 3.2.5 @@ -6892,6 +7500,34 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@25.0.1: + dependencies: + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.13 + parse5: 7.1.2 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@0.5.0: {} jsesc@2.5.2: {} @@ -6900,7 +7536,7 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-to-ts@3.1.0: + json-schema-to-ts@3.1.1: dependencies: '@babel/runtime': 7.24.1 ts-algebra: 2.0.0 @@ -6936,21 +7572,25 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.35.0: {} kolorist@1.8.0: {} - layercake@8.3.4(svelte@4.2.18)(typescript@5.5.3): + layercake@8.4.0(svelte@4.2.19)(typescript@5.6.3): dependencies: d3-array: 3.2.4 d3-color: 3.1.0 d3-scale: 4.0.2 d3-shape: 3.2.0 - svelte: 4.2.18 - typescript: 5.5.3 + svelte: 4.2.19 + typescript: 5.6.3 - layerchart@0.43.7(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18)(typescript@5.5.3): + layerchart@0.54.1(svelte@4.2.19)(typescript@5.6.3): dependencies: + '@layerstack/svelte-actions': 0.0.7 + '@layerstack/svelte-stores': 0.0.6 + '@layerstack/tailwind': 0.0.9 + '@layerstack/utils': 0.0.5 d3-array: 3.2.4 d3-color: 3.1.0 d3-delaunay: 6.0.4 @@ -6971,23 +7611,14 @@ snapshots: d3-tile: 1.0.0 d3-time: 3.1.0 date-fns: 3.6.0 - layercake: 8.3.4(svelte@4.2.18)(typescript@5.5.3) + layercake: 8.4.0(svelte@4.2.19)(typescript@5.6.3) lodash-es: 4.17.21 - posthog-js: 1.147.0 + posthog-js: 1.176.0 shapefile: 0.6.6 - svelte: 4.2.18 - svelte-ux: 0.72.4(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18) + svelte: 4.2.19 topojson-client: 3.1.0 transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss + - ts-node - typescript leven@3.1.0: {} @@ -6997,35 +7628,36 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@2.1.0: {} + libphonenumber-js@1.11.8: + optional: true - lilconfig@3.0.0: {} + lilconfig@2.1.0: {} lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} - lint-staged@15.2.7: + lint-staged@15.2.10: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4 + debug: 4.3.6 execa: 8.0.1 lilconfig: 3.1.2 - listr2: 8.2.3 - micromatch: 4.0.7 + listr2: 8.2.4 + micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.5 + yaml: 2.5.0 transitivePeerDependencies: - supports-color - listr2@8.2.3: + listr2@8.2.4: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 6.0.0 + log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.0 @@ -7067,23 +7699,25 @@ snapshots: lodash@4.17.21: {} - log-update@6.0.0: + log-update@6.1.0: dependencies: - ansi-escapes: 6.2.1 - cli-cursor: 4.0.0 + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 lru-cache@10.2.0: {} + lru-cache@11.0.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-svelte@0.408.0(svelte@4.2.18): + lucide-svelte@0.453.0(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 magic-string@0.25.9: dependencies: @@ -7103,12 +7737,7 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -7119,13 +7748,15 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + mimic-response@3.1.0: {} - min-indent@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 minimatch@3.1.2: dependencies: @@ -7141,24 +7772,20 @@ snapshots: minimist@1.2.8: {} - minipass@7.0.4: {} + minipass@7.1.2: {} mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mlly@1.6.1: dependencies: - acorn: 8.12.0 + acorn: 8.12.1 pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.4.0 - mode-watcher@0.4.0(svelte@4.2.18): + mode-watcher@0.4.1(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 mri@1.2.0: {} @@ -7190,7 +7817,9 @@ snapshots: node-addon-api@6.1.0: {} - node-releases@2.0.14: {} + node-addon-api@7.1.1: {} + + node-releases@2.0.18: {} normalize-path@3.0.0: {} @@ -7203,6 +7832,8 @@ snapshots: dependencies: path-key: 4.0.0 + nwsapi@2.2.13: {} + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -7222,14 +7853,14 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -7255,6 +7886,8 @@ snapshots: dependencies: p-limit: 4.0.0 + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7266,6 +7899,10 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5@7.1.2: + dependencies: + entities: 4.5.0 + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -7278,32 +7915,37 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.1 + minipass: 7.1.2 path-source@0.1.3: dependencies: array-source: 0.0.4 file-source: 0.6.1 - path-type@4.0.0: {} - pathe@1.1.2: {} periscopic@3.1.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.0: {} + picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -7318,44 +7960,44 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.39): + postcss-import@15.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.39 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.39): + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.39 + postcss: 8.4.47 - postcss-load-config@3.1.4(postcss@8.4.39): + postcss-load-config@3.1.4(postcss@8.4.47): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.39 + postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.39): + postcss-load-config@4.0.2(postcss@8.4.47): dependencies: - lilconfig: 3.0.0 - yaml: 2.3.4 + lilconfig: 3.1.2 + yaml: 2.5.0 optionalDependencies: - postcss: 8.4.39 + postcss: 8.4.47 - postcss-nested@6.0.1(postcss@8.4.39): + postcss-nested@6.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.39 + postcss: 8.4.47 postcss-selector-parser: 6.1.0 - postcss-safe-parser@6.0.0(postcss@8.4.39): + postcss-safe-parser@6.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.39 + postcss: 8.4.47 - postcss-scss@4.0.9(postcss@8.4.39): + postcss-scss@4.0.9(postcss@8.4.47): dependencies: - postcss: 8.4.39 + postcss: 8.4.47 postcss-selector-parser@6.1.0: dependencies: @@ -7364,14 +8006,15 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.39: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 - posthog-js@1.147.0: + posthog-js@1.176.0: dependencies: + core-js: 3.38.1 fflate: 0.4.8 preact: 10.19.5 web-vitals: 4.2.1 @@ -7399,10 +8042,10 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-svelte@3.2.5(prettier@3.3.3)(svelte@4.2.18): + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@4.2.19): dependencies: prettier: 3.3.3 - svelte: 4.2.18 + svelte: 4.2.19 prettier@2.8.8: {} @@ -7428,6 +8071,9 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: + optional: true + queue-microtask@1.2.3: {} queue-tick@1.0.1: {} @@ -7436,6 +8082,25 @@ snapshots: dependencies: safe-buffer: 5.2.1 + ranges-apply@7.0.16: + dependencies: + ranges-merge: 9.0.15 + tiny-invariant: 1.3.3 + + ranges-merge@9.0.15: + dependencies: + ranges-push: 7.0.15 + ranges-sort: 6.0.11 + + ranges-push@7.0.15: + dependencies: + codsen-utils: 1.6.4 + ranges-sort: 6.0.11 + string-collapse-leading-whitespace: 7.0.7 + string-trim-spaces-only: 5.0.10 + + ranges-sort@6.0.11: {} + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -7457,6 +8122,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.1: {} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 @@ -7505,27 +8172,23 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@4.0.0: + restore-cursor@5.1.0: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + onetime: 7.0.0 + signal-exit: 4.1.0 reusify@1.0.4: {} rfdc@1.4.1: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - robust-predicates@3.0.2: {} - rollup-plugin-svelte@7.1.6(rollup@2.79.1)(svelte@4.2.18): + rollup-plugin-svelte@7.2.2(rollup@2.79.1)(svelte@4.2.19): dependencies: '@rollup/pluginutils': 4.2.1 resolve.exports: 2.0.2 rollup: 2.79.1 - svelte: 4.2.18 + svelte: 4.2.19 rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: @@ -7539,27 +8202,30 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.14.1: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.1 - '@rollup/rollup-android-arm64': 4.14.1 - '@rollup/rollup-darwin-arm64': 4.14.1 - '@rollup/rollup-darwin-x64': 4.14.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 - '@rollup/rollup-linux-arm64-gnu': 4.14.1 - '@rollup/rollup-linux-arm64-musl': 4.14.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 - '@rollup/rollup-linux-riscv64-gnu': 4.14.1 - '@rollup/rollup-linux-s390x-gnu': 4.14.1 - '@rollup/rollup-linux-x64-gnu': 4.14.1 - '@rollup/rollup-linux-x64-musl': 4.14.1 - '@rollup/rollup-win32-arm64-msvc': 4.14.1 - '@rollup/rollup-win32-ia32-msvc': 4.14.1 - '@rollup/rollup-win32-x64-msvc': 4.14.1 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -7585,20 +8251,20 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} - sander@0.5.1: + sass@1.80.4: dependencies: - es6-promise: 3.3.1 - graceful-fs: 4.2.11 - mkdirp: 0.5.6 - rimraf: 2.7.1 + '@parcel/watcher': 2.4.1 + chokidar: 4.0.1 + immutable: 4.3.5 + source-map-js: 1.2.1 - sass@1.77.8: + saxes@6.0.0: dependencies: - chokidar: 3.5.3 - immutable: 4.3.5 - source-map-js: 1.2.0 + xmlchars: 2.2.0 semver@6.3.1: {} @@ -7665,8 +8331,6 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.1 - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-concat@1.0.1: {} @@ -7677,18 +8341,18 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + simple-icons@13.15.0: {} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - sirv@2.0.4: + sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.24 mrmime: 2.0.0 totalist: 3.0.1 - slash@3.0.0: {} - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -7703,18 +8367,18 @@ snapshots: socket.io-adapter@2.5.4: dependencies: - debug: 4.3.4 + debug: 4.3.6 ws: 8.11.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.7.5: + socket.io-client@4.8.1: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 - engine.io-client: 6.5.3 + debug: 4.3.6 + engine.io-client: 6.6.1 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -7724,17 +8388,17 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + debug: 4.3.6 transitivePeerDependencies: - supports-color - socket.io@4.7.5: + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4 - engine.io: 6.5.4 + debug: 4.3.6 + engine.io: 6.6.1 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -7742,14 +8406,7 @@ snapshots: - supports-color - utf-8-validate - sorcery@0.11.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 - minimist: 1.2.8 - sander: 0.5.1 - - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -7777,6 +8434,25 @@ snapshots: string-argv@0.3.2: {} + string-collapse-leading-whitespace@7.0.7: {} + + string-left-right@6.0.17: + dependencies: + codsen-utils: 1.6.4 + rfdc: 1.4.1 + + string-strip-html@13.4.8: + dependencies: + '@types/lodash-es': 4.17.12 + codsen-utils: 1.6.4 + html-entities: 2.5.2 + lodash-es: 4.17.21 + ranges-apply: 7.0.16 + ranges-push: 7.0.15 + string-left-right: 6.0.17 + + string-trim-spaces-only@5.0.10: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -7851,10 +8527,6 @@ snapshots: strip-final-newline@3.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -7863,7 +8535,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -7882,18 +8554,18 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - sveld@0.20.0(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8): + sveld@0.20.2(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4): dependencies: '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) - acorn: 8.12.0 + acorn: 8.12.1 comment-parser: 1.4.1 - fast-glob: 3.3.2 prettier: 2.8.8 rollup: 2.79.1 - rollup-plugin-svelte: 7.1.6(rollup@2.79.1)(svelte@4.2.18) - svelte: 4.2.18 - svelte-preprocess: 5.1.3(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18)(typescript@5.5.3) - typescript: 5.5.3 + rollup-plugin-svelte: 7.2.2(rollup@2.79.1)(svelte@4.2.19) + svelte: 4.2.19 + svelte-preprocess: 6.0.3(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4)(svelte@4.2.19)(typescript@5.6.3) + tinyglobby: 0.2.9 + typescript: 5.6.3 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -7905,120 +8577,104 @@ snapshots: - stylus - sugarss - svelte-check@3.8.4(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18): + svelte-check@4.0.5(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.5.3 - picocolors: 1.0.0 + chokidar: 4.0.1 + fdir: 6.4.0(picomatch@4.0.2) + picocolors: 1.1.0 sade: 1.8.1 - svelte: 4.2.18 - svelte-preprocess: 5.1.3(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18)(typescript@5.5.3) - typescript: 5.5.3 + svelte: 4.2.19 + typescript: 5.6.3 transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss + - picomatch - svelte-eslint-parser@0.39.2(svelte@4.2.18): + svelte-eslint-parser@0.43.0(svelte@4.2.19): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.39 - postcss-scss: 4.0.9(postcss@8.4.39) + postcss: 8.4.47 + postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: - svelte: 4.2.18 + svelte: 4.2.19 - svelte-eslint-parser@0.40.0(svelte@4.2.18): + svelte-headless-table@0.18.2(svelte@4.2.19): dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - postcss: 8.4.39 - postcss-scss: 4.0.9(postcss@8.4.39) - optionalDependencies: - svelte: 4.2.18 + svelte: 4.2.19 + svelte-keyed: 2.0.0(svelte@4.2.19) + svelte-render: 2.0.1(svelte@4.2.19) + svelte-subscribe: 2.0.1(svelte@4.2.19) - svelte-headless-table@0.18.2(svelte@4.2.18): + svelte-hmr@0.16.0(svelte@4.2.19): dependencies: - svelte: 4.2.18 - svelte-keyed: 2.0.0(svelte@4.2.18) - svelte-render: 2.0.1(svelte@4.2.18) - svelte-subscribe: 2.0.1(svelte@4.2.18) + svelte: 4.2.19 - svelte-hmr@0.16.0(svelte@4.2.18): + svelte-i18next@2.2.2(i18next@23.16.4)(svelte@4.2.19): dependencies: - svelte: 4.2.18 + i18next: 23.16.4 + svelte: 4.2.19 - svelte-i18next@2.2.2(i18next@23.12.1)(svelte@4.2.18): + svelte-keyed@2.0.0(svelte@4.2.19): dependencies: - i18next: 23.12.1 - svelte: 4.2.18 + svelte: 4.2.19 - svelte-keyed@2.0.0(svelte@4.2.18): + svelte-legos@0.2.5(svelte@4.2.19): dependencies: - svelte: 4.2.18 + canvas-confetti: 1.9.3 + prism-svelte: 0.5.0 + prismjs: 1.29.0 + svelte: 4.2.19 - svelte-lucide@1.0.6(svelte@4.2.18): + svelte-lucide@1.0.6(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 - svelte-persisted-store@0.11.0(svelte@4.2.18): + svelte-persisted-store@0.11.0(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 - svelte-preprocess@5.1.3(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18)(typescript@5.5.3): + svelte-preprocess@6.0.3(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4)(svelte@4.2.19)(typescript@5.6.3): dependencies: - '@types/pug': 2.0.10 - detect-indent: 6.1.0 - magic-string: 0.30.10 - sorcery: 0.11.0 - strip-indent: 3.0.0 - svelte: 4.2.18 + svelte: 4.2.19 optionalDependencies: '@babel/core': 7.24.3 - postcss: 8.4.39 - postcss-load-config: 4.0.2(postcss@8.4.39) - sass: 1.77.8 - typescript: 5.5.3 + postcss: 8.4.47 + postcss-load-config: 4.0.2(postcss@8.4.47) + sass: 1.80.4 + typescript: 5.6.3 - svelte-render@2.0.1(svelte@4.2.18): + svelte-render@2.0.1(svelte@4.2.19): dependencies: - svelte: 4.2.18 - svelte-subscribe: 2.0.1(svelte@4.2.18) + svelte: 4.2.19 + svelte-subscribe: 2.0.1(svelte@4.2.19) - svelte-sonner@0.3.27(svelte@4.2.18): + svelte-sonner@0.3.28(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 - svelte-subscribe@2.0.1(svelte@4.2.18): + svelte-subscribe@2.0.1(svelte@4.2.19): dependencies: - svelte: 4.2.18 + svelte: 4.2.19 - svelte-ux@0.72.4(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18): + svelte-ux@0.75.1(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4)(svelte@4.2.19): dependencies: - '@floating-ui/dom': 1.6.7 - '@fortawesome/fontawesome-common-types': 6.5.2 + '@floating-ui/dom': 1.6.11 + '@fortawesome/fontawesome-common-types': 6.6.0 '@mdi/js': 7.4.47 clsx: 2.1.1 culori: 4.0.1 d3-array: 3.2.4 d3-scale: 4.0.2 - date-fns: 3.6.0 + date-fns: 4.1.0 immer: 10.1.1 lodash-es: 4.17.21 prism-svelte: 0.5.0 prism-themes: 1.9.0 prismjs: 1.29.0 - sveld: 0.20.0(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8) - svelte: 4.2.18 - tailwind-merge: 2.4.0 + sveld: 0.20.2(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(sass@1.80.4) + svelte: 4.2.19 + tailwind-merge: 2.5.4 zod: 3.23.8 transitivePeerDependencies: - '@babel/core' @@ -8031,43 +8687,13 @@ snapshots: - stylus - sugarss - svelte-ux@0.73.2(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8)(svelte@4.2.18): - dependencies: - '@floating-ui/dom': 1.6.7 - '@fortawesome/fontawesome-common-types': 6.5.2 - '@mdi/js': 7.4.47 - clsx: 2.1.1 - culori: 4.0.1 - d3-array: 3.2.4 - d3-scale: 4.0.2 - date-fns: 3.6.0 - immer: 10.1.1 - lodash-es: 4.17.21 - prism-svelte: 0.5.0 - prism-themes: 1.9.0 - prismjs: 1.29.0 - sveld: 0.20.0(@babel/core@7.24.3)(postcss-load-config@4.0.2(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.8) - svelte: 4.2.18 - tailwind-merge: 2.4.0 - zod: 3.23.8 - transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss - - svelte@4.2.18: + svelte@4.2.19: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.0 aria-query: 5.3.0 axobject-query: 4.0.0 code-red: 1.0.4 @@ -8078,44 +8704,52 @@ snapshots: magic-string: 0.30.10 periscopic: 3.1.0 - sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18): + sveltekit-superforms@2.20.0(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(@types/json-schema@7.0.15)(svelte@4.2.19)(typescript@5.6.3): dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)) - devalue: 5.0.0 + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)))(svelte@4.2.19)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)) + devalue: 5.1.1 just-clone: 6.2.0 memoize-weak: 1.0.2 - svelte: 4.2.18 - ts-deepmerge: 7.0.0 + svelte: 4.2.19 + ts-deepmerge: 7.0.1 optionalDependencies: + '@effect/schema': 0.75.5(effect@3.9.2) '@exodus/schemasafe': 1.3.0 '@gcornut/valibot-json-schema': 0.31.0 - '@sinclair/typebox': 0.32.34 - '@sodaru/yup-to-json-schema': 2.0.1 + '@sinclair/typebox': 0.32.35 + '@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1) '@vinejs/vine': 1.8.0 - arktype: 2.0.0-dev.21 + arktype: 2.0.0-rc.8 + class-validator: 0.14.1 + effect: 3.9.2 joi: 17.13.3 - json-schema-to-ts: 3.1.0 + json-schema-to-ts: 3.1.1 superstruct: 2.0.2 - valibot: 0.35.0 + valibot: 0.41.0(typescript@5.6.3) yup: 1.4.0 zod: 3.23.8 - zod-to-json-schema: 3.23.1(zod@3.23.8) + zod-to-json-schema: 3.23.3(zod@3.23.8) + transitivePeerDependencies: + - '@types/json-schema' + - typescript - synckit@0.8.8: + symbol-tree@3.2.4: {} + + synckit@0.9.1: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.3 + tslib: 2.8.0 tabbable@6.2.0: {} - tailwind-merge@2.4.0: {} + tailwind-merge@2.5.4: {} - tailwind-variants@0.2.1(tailwindcss@3.4.4): + tailwind-variants@0.2.1(tailwindcss@3.4.14): dependencies: - tailwind-merge: 2.4.0 - tailwindcss: 3.4.4 + tailwind-merge: 2.5.4 + tailwindcss: 3.4.14 - tailwindcss@3.4.4: + tailwindcss@3.4.14: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -8127,15 +8761,15 @@ snapshots: is-glob: 4.0.3 jiti: 1.21.0 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.39 - postcss-import: 15.1.0(postcss@8.4.39) - postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39) - postcss-nested: 6.0.1(postcss@8.4.39) + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.0.1(postcss@8.4.47) postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 @@ -8183,7 +8817,7 @@ snapshots: terser@5.30.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.0 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -8211,6 +8845,26 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 + tiny-invariant@1.3.3: {} + + tinyexec@0.3.0: {} + + tinyglobby@0.2.0: + dependencies: + fdir: 6.4.0(picomatch@4.0.2) + picomatch: 4.0.2 + + tinyglobby@0.2.9: + dependencies: + fdir: 6.4.0(picomatch@4.0.2) + picomatch: 4.0.2 + + tldts-core@6.1.50: {} + + tldts@6.1.50: + dependencies: + tldts-core: 6.1.50 + to-data-view@1.1.0: {} to-fast-properties@2.0.0: {} @@ -8228,36 +8882,55 @@ snapshots: totalist@3.0.1: {} + tough-cookie@5.0.0: + dependencies: + tldts: 6.1.50 + tr46@1.0.1: dependencies: punycode: 2.3.1 + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + ts-algebra@2.0.0: optional: true - ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.5.3 + typescript: 5.6.3 - ts-deepmerge@7.0.0: {} + ts-deepmerge@7.0.1: {} ts-interface-checker@0.1.13: {} + ts-json-schema-generator@2.3.0: + dependencies: + '@types/json-schema': 7.0.15 + commander: 12.1.0 + glob: 10.4.5 + json5: 2.2.3 + normalize-path: 3.0.0 + safe-stable-stringify: 2.5.0 + tslib: 2.8.0 + typescript: 5.6.3 + tslib@2.4.0: optional: true - tslib@2.6.3: {} + tslib@2.8.0: {} tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - tw-colors@3.3.1(tailwindcss@3.4.4): + tw-colors@3.3.2(tailwindcss@3.4.14): dependencies: color: 4.2.3 flat: 5.0.2 lodash.foreach: 4.5.0 - tailwindcss: 3.4.4 + tailwindcss: 3.4.14 type-check@0.4.0: dependencies: @@ -8300,18 +8973,18 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-eslint@7.16.0(eslint@9.7.0)(typescript@5.5.3): + typescript-eslint@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/parser': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - eslint: 9.7.0 + '@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.0))(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - typescript@5.5.3: {} + typescript@5.6.3: {} ufo@1.4.0: {} @@ -8352,11 +9025,11 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: - browserslist: 4.23.0 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: @@ -8367,7 +9040,9 @@ snapshots: valibot@0.31.1: optional: true - valibot@0.35.0: + valibot@0.41.0(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 optional: true validator@13.12.0: @@ -8375,38 +9050,60 @@ snapshots: vary@1.1.2: {} - vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0): + vaul-svelte@0.3.2(svelte@4.2.19): dependencies: - debug: 4.3.4 - fast-glob: 3.3.2 + bits-ui: 0.21.16(svelte@4.2.19) + svelte: 4.2.19 + + vite-plugin-pwa@0.20.5(@vite-pwa/assets-generator@0.2.6)(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0))(workbox-build@7.0.0)(workbox-window@7.0.0): + dependencies: + debug: 4.3.6 pretty-bytes: 6.1.1 - vite: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) + tinyglobby: 0.2.0 + vite: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) workbox-build: 7.0.0 workbox-window: 7.0.0 optionalDependencies: - '@vite-pwa/assets-generator': 0.2.4 + '@vite-pwa/assets-generator': 0.2.6 transitivePeerDependencies: - supports-color - vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0): + vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.14.1 + postcss: 8.4.47 + rollup: 4.21.2 optionalDependencies: '@types/node': 20.11.30 fsevents: 2.3.3 - sass: 1.77.8 + sass: 1.80.4 terser: 5.30.0 - vitefu@0.2.5(vite@5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0)): + vitefu@0.2.5(vite@5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0)): optionalDependencies: - vite: 5.3.3(@types/node@20.11.30)(sass@1.77.8)(terser@5.30.0) + vite: 5.4.10(@types/node@20.11.30)(sass@1.80.4)(terser@5.30.0) + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 web-vitals@4.2.1: {} webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -8444,7 +9141,7 @@ snapshots: workbox-build@7.0.0: dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.24.3 '@babel/preset-env': 7.24.3(@babel/core@7.24.3) '@babel/runtime': 7.24.1 @@ -8452,7 +9149,7 @@ snapshots: '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.12.0 + ajv: 8.17.1 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -8568,7 +9265,15 @@ snapshots: ws@8.11.0: {} - xmlhttprequest-ssl@2.0.0: {} + ws@8.17.1: {} + + ws@8.18.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xmlhttprequest-ssl@2.1.1: {} y18n@5.0.8: {} @@ -8576,16 +9281,14 @@ snapshots: yaml@1.10.2: {} - yaml@2.3.4: {} - - yaml@2.4.5: {} + yaml@2.5.0: {} yargs-parser@21.1.1: {} yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -8604,7 +9307,7 @@ snapshots: type-fest: 2.19.0 optional: true - zod-to-json-schema@3.23.1(zod@3.23.8): + zod-to-json-schema@3.23.3(zod@3.23.8): dependencies: zod: 3.23.8 optional: true diff --git a/src/lib/assets/Icon_Gold_Star.png b/src/lib/assets/Icon_Gold_Star.png deleted file mode 100644 index e4cbe22a..00000000 Binary files a/src/lib/assets/Icon_Gold_Star.png and /dev/null differ diff --git a/src/lib/assets/Icon_Purple_Star.png b/src/lib/assets/Icon_Purple_Star.png deleted file mode 100644 index f3d06973..00000000 Binary files a/src/lib/assets/Icon_Purple_Star.png and /dev/null differ diff --git a/src/lib/assets/Icon_Weapon_Bow.png b/src/lib/assets/Icon_Weapon_Bow.png deleted file mode 100644 index a02bba1d..00000000 Binary files a/src/lib/assets/Icon_Weapon_Bow.png and /dev/null differ diff --git a/src/lib/assets/Icon_Weapon_Catalyst.png b/src/lib/assets/Icon_Weapon_Catalyst.png deleted file mode 100644 index 38617179..00000000 Binary files a/src/lib/assets/Icon_Weapon_Catalyst.png and /dev/null differ diff --git a/src/lib/assets/Icon_Weapon_Claymore.png b/src/lib/assets/Icon_Weapon_Claymore.png deleted file mode 100644 index 6d16d293..00000000 Binary files a/src/lib/assets/Icon_Weapon_Claymore.png and /dev/null differ diff --git a/src/lib/assets/Icon_Weapon_Polearm.png b/src/lib/assets/Icon_Weapon_Polearm.png deleted file mode 100644 index ff44aec9..00000000 Binary files a/src/lib/assets/Icon_Weapon_Polearm.png and /dev/null differ diff --git a/src/lib/assets/Icon_Weapon_Sword.png b/src/lib/assets/Icon_Weapon_Sword.png deleted file mode 100644 index 5bd63083..00000000 Binary files a/src/lib/assets/Icon_Weapon_Sword.png and /dev/null differ diff --git a/src/lib/assets/icons/Element_Cryo.svg b/src/lib/assets/icons/Element_Cryo.svg deleted file mode 100644 index 9cf0b267..00000000 --- a/src/lib/assets/icons/Element_Cryo.svg +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - - - - - - diff --git a/src/lib/assets/icons/Element_Geo.svg b/src/lib/assets/icons/Element_Geo.svg deleted file mode 100644 index b8e09003..00000000 --- a/src/lib/assets/icons/Element_Geo.svg +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - - - - diff --git a/src/lib/assets/icons/Element_Anemo.svg b/src/lib/assets/icons/elements/Element_Anemo.svg similarity index 98% rename from src/lib/assets/icons/Element_Anemo.svg rename to src/lib/assets/icons/elements/Element_Anemo.svg index e24baccf..398f3e78 100644 --- a/src/lib/assets/icons/Element_Anemo.svg +++ b/src/lib/assets/icons/elements/Element_Anemo.svg @@ -1,109 +1,109 @@ - - - - - - + + + + + + diff --git a/src/lib/assets/icons/Element_Anemo_Outline.PNG b/src/lib/assets/icons/elements/Element_Anemo_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Anemo_Outline.PNG rename to src/lib/assets/icons/elements/Element_Anemo_Outline.PNG diff --git a/src/lib/assets/icons/elements/Element_Cryo.svg b/src/lib/assets/icons/elements/Element_Cryo.svg new file mode 100644 index 00000000..89090c11 --- /dev/null +++ b/src/lib/assets/icons/elements/Element_Cryo.svg @@ -0,0 +1,162 @@ + + + + + + diff --git a/src/lib/assets/icons/Element_Cryo_Outline.PNG b/src/lib/assets/icons/elements/Element_Cryo_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Cryo_Outline.PNG rename to src/lib/assets/icons/elements/Element_Cryo_Outline.PNG diff --git a/src/lib/assets/icons/Element_Dendro.svg b/src/lib/assets/icons/elements/Element_Dendro.svg similarity index 99% rename from src/lib/assets/icons/Element_Dendro.svg rename to src/lib/assets/icons/elements/Element_Dendro.svg index 6cb6b9cb..1e01b6b2 100644 --- a/src/lib/assets/icons/Element_Dendro.svg +++ b/src/lib/assets/icons/elements/Element_Dendro.svg @@ -1,111 +1,111 @@ - - - - - - + + + + + + diff --git a/src/lib/assets/icons/Element_Dendro_Outline.PNG b/src/lib/assets/icons/elements/Element_Dendro_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Dendro_Outline.PNG rename to src/lib/assets/icons/elements/Element_Dendro_Outline.PNG diff --git a/src/lib/assets/icons/Element_Electro.svg b/src/lib/assets/icons/elements/Element_Electro.svg similarity index 99% rename from src/lib/assets/icons/Element_Electro.svg rename to src/lib/assets/icons/elements/Element_Electro.svg index a8803cd6..ad8bdfbe 100644 --- a/src/lib/assets/icons/Element_Electro.svg +++ b/src/lib/assets/icons/elements/Element_Electro.svg @@ -1,323 +1,323 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/lib/assets/icons/elements/Element_Geo.svg b/src/lib/assets/icons/elements/Element_Geo.svg new file mode 100644 index 00000000..9c42766b --- /dev/null +++ b/src/lib/assets/icons/elements/Element_Geo.svg @@ -0,0 +1,66 @@ + + + + + + diff --git a/src/lib/assets/icons/Element_Geo_Outline.PNG b/src/lib/assets/icons/elements/Element_Geo_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Geo_Outline.PNG rename to src/lib/assets/icons/elements/Element_Geo_Outline.PNG diff --git a/src/lib/assets/icons/Element_Hydro.svg b/src/lib/assets/icons/elements/Element_Hydro.svg similarity index 99% rename from src/lib/assets/icons/Element_Hydro.svg rename to src/lib/assets/icons/elements/Element_Hydro.svg index fff17890..7ddf1576 100644 --- a/src/lib/assets/icons/Element_Hydro.svg +++ b/src/lib/assets/icons/elements/Element_Hydro.svg @@ -1,266 +1,266 @@ - - - - - - - - + + + + + + + + diff --git a/src/lib/assets/icons/Element_Hydro_Outline.PNG b/src/lib/assets/icons/elements/Element_Hydro_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Hydro_Outline.PNG rename to src/lib/assets/icons/elements/Element_Hydro_Outline.PNG diff --git a/src/lib/assets/icons/Element_Pyro.svg b/src/lib/assets/icons/elements/Element_Pyro.svg similarity index 99% rename from src/lib/assets/icons/Element_Pyro.svg rename to src/lib/assets/icons/elements/Element_Pyro.svg index d1372ad4..d3fa1dab 100644 --- a/src/lib/assets/icons/Element_Pyro.svg +++ b/src/lib/assets/icons/elements/Element_Pyro.svg @@ -1,199 +1,199 @@ - - - - - - - + + + + + + + diff --git a/src/lib/assets/icons/Element_Pyro_Outline.PNG b/src/lib/assets/icons/elements/Element_Pyro_Outline.PNG similarity index 100% rename from src/lib/assets/icons/Element_Pyro_Outline.PNG rename to src/lib/assets/icons/elements/Element_Pyro_Outline.PNG diff --git a/src/lib/assets/icons/primogem.webp b/src/lib/assets/icons/primogem.webp new file mode 100644 index 00000000..cafb287b Binary files /dev/null and b/src/lib/assets/icons/primogem.webp differ diff --git a/src/lib/assets/icons/weapons/bow.webp b/src/lib/assets/icons/weapons/bow.webp new file mode 100644 index 00000000..b0ca2781 Binary files /dev/null and b/src/lib/assets/icons/weapons/bow.webp differ diff --git a/src/lib/assets/icons/weapons/catalyst.webp b/src/lib/assets/icons/weapons/catalyst.webp new file mode 100644 index 00000000..0f61d250 Binary files /dev/null and b/src/lib/assets/icons/weapons/catalyst.webp differ diff --git a/src/lib/assets/icons/weapons/claymore.webp b/src/lib/assets/icons/weapons/claymore.webp new file mode 100644 index 00000000..4b65bb0e Binary files /dev/null and b/src/lib/assets/icons/weapons/claymore.webp differ diff --git a/src/lib/assets/icons/weapons/polearm.webp b/src/lib/assets/icons/weapons/polearm.webp new file mode 100644 index 00000000..95515a5a Binary files /dev/null and b/src/lib/assets/icons/weapons/polearm.webp differ diff --git a/src/lib/assets/icons/weapons/sword.webp b/src/lib/assets/icons/weapons/sword.webp new file mode 100644 index 00000000..ca8107f5 Binary files /dev/null and b/src/lib/assets/icons/weapons/sword.webp differ diff --git a/src/lib/assets/languages/VI.svg b/src/lib/assets/languages/VI.svg new file mode 100644 index 00000000..7e4bac8f --- /dev/null +++ b/src/lib/assets/languages/VI.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/lib/components/achievement/AchievementCategoryCard.svelte b/src/lib/components/achievement/AchievementCategoryCard.svelte new file mode 100644 index 00000000..c8cf12a9 --- /dev/null +++ b/src/lib/components/achievement/AchievementCategoryCard.svelte @@ -0,0 +1,65 @@ + + +
+ {#if inSidebar} +
+ {name} +
+
+ + {name} + + +
+ {:else} +
+
+ {name} +
+
+
+ + + {name} + +
+ {/if} +
diff --git a/src/lib/components/achievement/AchievementList.svelte b/src/lib/components/achievement/AchievementList.svelte new file mode 100644 index 00000000..479bdd36 --- /dev/null +++ b/src/lib/components/achievement/AchievementList.svelte @@ -0,0 +1,258 @@ + + + +
+ +
+ + {$i18n.t('achievement.check_all')} +
+
+ {#each sortedAchievements as achievement} + +
+
+ {achievement.name} + {achievement.desc} +
+ {#if achievement.hidden === 'Yes'} + Hidden + {/if} + {#if achievement.type} + {achievement.type} + {/if} + {#if achievement.version} + {achievement.version} + {/if} +
+
+
+ + {achievement.reward} + + + + handleAchievedChange(achievement, checked)} + /> +
+
+ {#if achievement.requirements || achievement.steps} + +
+ + {$i18n.t('achievement.more_info')} + + +
+ + {#if achievement.requirements} + Requirements + {#if achievement.requirementQuestLink} + + {achievement.requirements} + + ( + + wiki + + ) + + {:else} + {achievement.requirements} + {/if} + {/if} + + {#if achievement.steps} + Steps + {#if Array.isArray(achievement.steps)} + {#each achievement.steps as step, index} +
+ + handleStepChange(achievement, index, checked)} + id={`${achievement.id}-${index}`} + /> + {step} +
+ {/each} + {:else} +
+ + handleStepChange(achievement, 0, checked)} + id={`${achievement.id}-0`} + /> + {achievement.steps} +
+ {/if} + {/if} +
+
+ {/if} +
+ {/each} +
+
diff --git a/src/lib/components/graphs/PullDistributionByMonth.svelte b/src/lib/components/graphs/PullDistributionByMonth.svelte index 6a3af883..dfedc3bd 100644 --- a/src/lib/components/graphs/PullDistributionByMonth.svelte +++ b/src/lib/components/graphs/PullDistributionByMonth.svelte @@ -1,37 +1,39 @@ -
- - - - - - - - - - +
+
diff --git a/src/lib/components/layout/DefaultLayout.svelte b/src/lib/components/layout/DefaultLayout.svelte index 6500d559..ed26c637 100644 --- a/src/lib/components/layout/DefaultLayout.svelte +++ b/src/lib/components/layout/DefaultLayout.svelte @@ -11,7 +11,9 @@ {'Dval.in | ' + title} -
+
{#if title !== '' || $$slots.titlebarActions}
backend.auth.logout()} + on:click={() => { + backend.auth.logout(); + }} title={$i18n.t('navigation.logout')} /> {:else} diff --git a/src/lib/components/navigator/entry/index.ts b/src/lib/components/navigator/entry/index.ts index 56f37f98..69eb4409 100644 --- a/src/lib/components/navigator/entry/index.ts +++ b/src/lib/components/navigator/entry/index.ts @@ -2,4 +2,5 @@ export interface ISidebarEntry { readonly title: string; readonly link: string; readonly icon: string; + readonly external?: boolean; } diff --git a/src/lib/components/navigator/language-switcher/LanguageSwitcher.svelte b/src/lib/components/navigator/language-switcher/LanguageSwitcher.svelte index 75747e1b..63362f1a 100644 --- a/src/lib/components/navigator/language-switcher/LanguageSwitcher.svelte +++ b/src/lib/components/navigator/language-switcher/LanguageSwitcher.svelte @@ -9,6 +9,7 @@ import langFlagPL from '$lib/assets/languages/PL.svg'; import langFlagRU from '$lib/assets/languages/RU.svg'; import langFlagTH from '$lib/assets/languages/TH.svg'; + import langFlagVI from '$lib/assets/languages/VI.svg'; import langFlagZHS from '$lib/assets/languages/ZHS.svg'; import langFlagZHT from '$lib/assets/languages/ZHT.svg'; import { @@ -25,9 +26,11 @@ import { AlertDescription, AlertTitle } from '$lib/components/ui/alert/index.js'; import Icon from '$lib/components/ui/icon/icon.svelte'; import { mdiTranslate } from '@mdi/js'; + import BackendService from '$lib/services/backend'; let selectedLanguage = get(i18n).language; - + const backend = BackendService.getInstance(); + $: createConfigMutation = backend.user.updateConfig(); let isDialogOpen = false; const languages = Object.keys(get(i18n).options.resources ?? {}); @@ -52,12 +55,12 @@ return langFlagRU; case 'TH': return langFlagTH; + case 'VI': + return langFlagVI; case 'ZHS': return langFlagZHS; case 'ZHT': return langFlagZHT; - default: - return langFlagEN; } }; @@ -68,6 +71,9 @@ const saveLanguage = () => { $i18n.changeLanguage(selectedLanguage); isDialogOpen = false; + $createConfigMutation.mutate({ + config: { preferedLanguage: selectedLanguage.toLowerCase() } + }); }; const openDialog = () => { diff --git a/src/lib/components/tables/banner-history-table/BannerHistoryTable.svelte b/src/lib/components/tables/banner-history-table/BannerHistoryTable.svelte index 693bbfe0..4eae3ef1 100644 --- a/src/lib/components/tables/banner-history-table/BannerHistoryTable.svelte +++ b/src/lib/components/tables/banner-history-table/BannerHistoryTable.svelte @@ -17,7 +17,7 @@ PrevButton as PaginationPrevButton, Root as PaginationRoot } from '$lib/components/ui/pagination'; - import { readable } from 'svelte/store'; + import { type Readable } from 'svelte/store'; import { createRender, createTable, Render, Subscribe } from 'svelte-headless-table'; import { mdiAccount, @@ -37,7 +37,7 @@ } from 'svelte-headless-table/plugins'; import { Button } from '$lib/components/ui/button'; import SelectFilter from './SelectFilter.svelte'; - import type { IMappedWish } from '$lib/types/wish'; + import type { IWish } from '$lib/types/wish'; import DateRangeFilter from '$lib/components/tables/banner-history-table/DateRangeFilter.svelte'; import NameCell from '$lib/components/tables/banner-history-table/NameCell.svelte'; import DateCell from '$lib/components/tables/banner-history-table/DateCell.svelte'; @@ -46,14 +46,14 @@ const PAGE_SIZE = 25; - export let data: IMappedWish[]; + export let data: Readable; - const table = createTable(readable(data), { + const table = createTable(data, { page: addPagination({ initialPageSize: PAGE_SIZE }), filter: addColumnFilters(), sort: addSortBy({ - initialSortKeys: [{ id: 'number', order: 'desc' }], - toggleOrder: ['asc', 'desc'] + initialSortKeys: [{ id: 'order', order: 'desc' }], + toggleOrder: ['desc', 'asc'] }), resize: addResizedColumns() }); @@ -79,11 +79,11 @@ const columns = table.createColumns([ table.column({ - accessor: 'number', - header: '#', + accessor: 'order', + header: 'Order', plugins: { resize: { - initialWidth: 64 + initialWidth: 80 } } }), @@ -229,7 +229,7 @@ {#each row.cells as cell (cell.id)} @@ -238,7 +238,7 @@ class={`p-2 ${cell.id === 'key' ? 'text-start' : 'text-center'} `} > {#if cell.id === 'number'} - {data.length - parseInt(cell.row.id)} + {$data.length - parseInt(cell.row.id)} {:else} {/if} diff --git a/src/lib/components/tables/banner-history-table/DateRangeFilter.svelte b/src/lib/components/tables/banner-history-table/DateRangeFilter.svelte index 8333cca7..683f37d2 100644 --- a/src/lib/components/tables/banner-history-table/DateRangeFilter.svelte +++ b/src/lib/components/tables/banner-history-table/DateRangeFilter.svelte @@ -64,6 +64,16 @@ +
+ + Clear Filter + +
-
- - Clear Filter - -
diff --git a/src/lib/components/tables/banner-history-table/NameCell.svelte b/src/lib/components/tables/banner-history-table/NameCell.svelte index e6f2779b..59b41693 100644 --- a/src/lib/components/tables/banner-history-table/NameCell.svelte +++ b/src/lib/components/tables/banner-history-table/NameCell.svelte @@ -1,16 +1,16 @@
diff --git a/src/lib/components/tables/banner-history-table/SelectFilter.svelte b/src/lib/components/tables/banner-history-table/SelectFilter.svelte index 4e8bf2f2..4029abbe 100644 --- a/src/lib/components/tables/banner-history-table/SelectFilter.svelte +++ b/src/lib/components/tables/banner-history-table/SelectFilter.svelte @@ -1,14 +1,13 @@ - + + {/if} diff --git a/src/lib/components/ui/banner-overview-card/BannerOverviewCard.svelte b/src/lib/components/ui/banner-overview-card/BannerOverviewCard.svelte index 169beab4..d098e3dd 100644 --- a/src/lib/components/ui/banner-overview-card/BannerOverviewCard.svelte +++ b/src/lib/components/ui/banner-overview-card/BannerOverviewCard.svelte @@ -3,29 +3,43 @@ import Text from '$lib/components/typography/Text.svelte'; import Icon from '$lib/components/ui/icon/icon.svelte'; import PullChip from '$lib/components/ui/pull-chip/PullChip.svelte'; - import type { IMappedWish } from '$lib/types/wish.js'; + import type { IWish } from '$lib/types/wish.js'; import { Card, CardHeader } from '$lib/components/ui/card'; import { CardContent } from '$lib/components/ui/card/index.js'; import InfoCell from '$lib/components/ui/info-cell/InfoCell.svelte'; - import { mdiCloseCircle, mdiMoonWaningCrescent } from '@mdi/js'; + import { mdiCloseCircle } from '@mdi/js'; import { Alert, AlertDescription, AlertTitle } from '$lib/components/ui/alert'; import i18n from '$lib/services/i18n'; import type { WishBannerKey } from '$lib/types/keys/WishBannerKey'; + import PrimogemIcon from '$lib/assets/icons/primogem.webp'; export let icon: string; export let key: WishBannerKey; - export let data: IMappedWish[]; + export let data: (IWish & { name: string })[]; + data.sort((a, b) => b.order - a.order); + const MAX_CHARACTER_LENGTH = 200; + const PICTURE_AND_PITY_LENGTH = 6; + const fiveStars = data.filter((wish) => wish.rarity === 5); - const fiveStars = data - .filter((wish: IMappedWish) => wish.rarity === 5) - .sort((a, b) => b.number - a.number); + const fourStars = data.filter((wish) => wish.rarity === 4); - const fourStars = data.filter((wish: IMappedWish) => wish.rarity === 4); + const threeStars = data.filter((wish) => wish.rarity === 3); - const threeStars = data.filter((wish: IMappedWish) => wish.rarity === 3); - - const filterFiveStars = (): IMappedWish[] => { - return fiveStars.slice(0, 10); + const fiveStarToDisplay = () => { + let charLength = 0; + let char = []; + for (let i = 0; i < fiveStars.length; i++) { + if ( + charLength + fiveStars[i].name.length + PICTURE_AND_PITY_LENGTH < + MAX_CHARACTER_LENGTH + ) { + char.push(fiveStars[i]); + charLength += fiveStars[i].name.length + PICTURE_AND_PITY_LENGTH; + } else { + break; + } + } + return char; }; const fiveStarPity = data.findIndex((wish) => wish.rarity === 5) === -1 @@ -51,7 +65,7 @@ {data.length} - + primogem icon {data.length * 160} @@ -81,11 +95,16 @@
- {#if filterFiveStars().length > 0} + {#if fiveStarToDisplay().length > 0} {$i18n.t('wish.overview.card.latest_pulls.title')}
- {#each filterFiveStars() as pull} - + {#each fiveStarToDisplay() as pull} + {/each}
{:else} diff --git a/src/lib/components/ui/builds/artifact-item.svelte b/src/lib/components/ui/builds/artifact-item.svelte index f574558b..99850fd2 100644 --- a/src/lib/components/ui/builds/artifact-item.svelte +++ b/src/lib/components/ui/builds/artifact-item.svelte @@ -23,7 +23,6 @@
{#each { length: rarity } as _} @@ -41,11 +40,7 @@ alt={key} />
- +

{key.replace(/([A-Z])/g, ' $1').trim()}

diff --git a/src/lib/components/ui/builds/character-builds.svelte b/src/lib/components/ui/builds/character-builds.svelte index bf7c5588..c175b9d2 100644 --- a/src/lib/components/ui/builds/character-builds.svelte +++ b/src/lib/components/ui/builds/character-builds.svelte @@ -8,7 +8,7 @@ import IconCirclet from '$lib/assets/Icon_Circlet_of_Logos.png'; import IconGoblet from '$lib/assets/Icon_Goblet_of_Eonothem.png'; import IconSands from '$lib/assets/Icon_Sands_of_Eon.png'; - import { dataIndexStore } from '$lib/store/index_store.js'; + import { dataIndex } from '$lib/store/index_store.js'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '$lib/components/ui/tabs'; import i18n from '$lib/services/i18n'; @@ -81,8 +81,7 @@ @@ -90,7 +89,7 @@ {#each build.weapons.altWeapons as alt} {/each} diff --git a/src/lib/components/ui/builds/weapon-item.svelte b/src/lib/components/ui/builds/weapon-item.svelte index 6c69b2f4..07e3158f 100644 --- a/src/lib/components/ui/builds/weapon-item.svelte +++ b/src/lib/components/ui/builds/weapon-item.svelte @@ -5,7 +5,7 @@ import Badge from '../badge/badge.svelte'; import S3Service from '$lib/services/s3'; import { type WeaponKey } from '$lib/types/keys/WeaponKey'; - import { dataIndexStore } from '$lib/store/index_store'; + import { dataIndex } from '$lib/store/index_store'; export let signature: Boolean, rarity: number, @@ -18,19 +18,15 @@ {$dataIndexStore.weapon[key].name}
{#each { length: rarity } as _} - + {/each}
- {$dataIndexStore.weapon[key].name} + {$dataIndex.weapon[key].name} R{refine}
@@ -42,11 +38,7 @@ alt={key} />
- +

{key.replace(/([A-Z])/g, ' $1').trim()}

diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/CardContent.svelte similarity index 100% rename from src/lib/components/ui/card/card-content.svelte rename to src/lib/components/ui/card/CardContent.svelte diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/CardDescription.svelte similarity index 100% rename from src/lib/components/ui/card/card-description.svelte rename to src/lib/components/ui/card/CardDescription.svelte diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/CardFooter.svelte similarity index 100% rename from src/lib/components/ui/card/card-footer.svelte rename to src/lib/components/ui/card/CardFooter.svelte diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/CardHeader.svelte similarity index 100% rename from src/lib/components/ui/card/card-header.svelte rename to src/lib/components/ui/card/CardHeader.svelte diff --git a/src/lib/components/ui/card/CardLevel.svelte b/src/lib/components/ui/card/CardLevel.svelte deleted file mode 100644 index 419e7a05..00000000 --- a/src/lib/components/ui/card/CardLevel.svelte +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/CardTitle.svelte similarity index 100% rename from src/lib/components/ui/card/card-title.svelte rename to src/lib/components/ui/card/CardTitle.svelte diff --git a/src/lib/components/ui/card/CharCard.svelte b/src/lib/components/ui/card/CharCard.svelte index 1e4c752a..e17c0deb 100644 --- a/src/lib/components/ui/card/CharCard.svelte +++ b/src/lib/components/ui/card/CharCard.svelte @@ -15,7 +15,7 @@
+ import Text from '$lib/components/typography/Text.svelte'; + import S3Service from '$lib/services/s3'; + + export let name: string; + export let img: string; + export let type: string; + export let level: number; + export let ascencion: number; + export let refinement: number; + export let rarity: number; + export let location: string; + + +
+ {#if location !== ''} +
+ {location} +
+ {/if} + +
+

+ {refinement} +

+
+ +
+ {name} +
+ +
+ + Lv. {level} + +
+ +
+ + {name} + + +
+
diff --git a/src/lib/components/ui/card/WeapCard.svelte b/src/lib/components/ui/card/WeapCard.svelte new file mode 100644 index 00000000..dcc2fd23 --- /dev/null +++ b/src/lib/components/ui/card/WeapCard.svelte @@ -0,0 +1,31 @@ + + +
+
+ {name} + {count} +
+
+ + {name} + + + +
+
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts index 86c54082..c7800bac 100644 --- a/src/lib/components/ui/card/index.ts +++ b/src/lib/components/ui/card/index.ts @@ -1,9 +1,9 @@ import Root from './card.svelte'; -import Content from './card-content.svelte'; -import Description from './card-description.svelte'; -import Footer from './card-footer.svelte'; -import Header from './card-header.svelte'; -import Title from './card-title.svelte'; +import Content from './CardContent.svelte'; +import Description from './CardDescription.svelte'; +import Footer from './CardFooter.svelte'; +import Header from './CardHeader.svelte'; +import Title from './CardTitle.svelte'; export { Root, diff --git a/src/lib/components/ui/character-tabs/character-tabs.svelte b/src/lib/components/ui/character-tabs/character-tabs.svelte index 918d4447..447e5845 100644 --- a/src/lib/components/ui/character-tabs/character-tabs.svelte +++ b/src/lib/components/ui/character-tabs/character-tabs.svelte @@ -1,6 +1,6 @@ + + + + {$i18n.t('weapons.detailed.tab.stats.title')} + + {$i18n.t('weapons.detailed.tab.refinement.title')} + + + + + + + + + + {#each weaponData.refinements as refinement} + + {weaponData.passive}. {refinement.refinement} + {refinement.desc} + + {/each} + + diff --git a/src/lib/components/ui/date-range-picker/DateRangePicker.svelte b/src/lib/components/ui/date-range-picker/DateRangePicker.svelte index c67db86d..ad27e27c 100644 --- a/src/lib/components/ui/date-range-picker/DateRangePicker.svelte +++ b/src/lib/components/ui/date-range-picker/DateRangePicker.svelte @@ -4,6 +4,7 @@ import { cn } from '$lib/utils'; import { Button } from '$lib/components/ui/button'; import { RangeCalendar } from '$lib/components/ui/range-calendar'; + import { Popover, PopoverContent, PopoverTrigger } from '$lib/components/ui/popover'; const df = new DateFormatter('en-US', { dateStyle: 'medium' @@ -14,8 +15,8 @@
- - + +
diff --git a/src/lib/components/ui/dragdrop/DragDropList.svelte b/src/lib/components/ui/dragdrop/DragDropList.svelte new file mode 100644 index 00000000..423d65b2 --- /dev/null +++ b/src/lib/components/ui/dragdrop/DragDropList.svelte @@ -0,0 +1,295 @@ + + + +
+
+

+
+ +
+ {#each data as datum, i (datum.id ? datum.id : JSON.stringify(datum))} + +
+
+ + +
+ +
+ {#if datum.html} + {@html datum.html} + {:else if datum.text} +

{datum.text}

+ {:else if datum.check} +
+ + check(i)} + class="" + id={datum.check + .replace(/[^a-zA-Z]/g, '') + .replace(/(?:^\w|[A-Z]|\b\w)/g, (match, index) => + index === 0 ? match.toLowerCase() : match.toUpperCase() + ) + .concat('Check')} + checked={data[i].checked} + /> +
+ {:else} +

{datum}

+ {/if} +
+ +
+ {#if removesItems} + + {/if} +
+
+ {/each} +
+
+ + diff --git a/src/lib/components/ui/drawer-dropdown/DrawerDropdown.svelte b/src/lib/components/ui/drawer-dropdown/DrawerDropdown.svelte new file mode 100644 index 00000000..f33a2abe --- /dev/null +++ b/src/lib/components/ui/drawer-dropdown/DrawerDropdown.svelte @@ -0,0 +1,31 @@ + + +{#if $isDesktop} + + + + + + + + +{:else} + + + + + + + + +{/if} diff --git a/src/lib/components/ui/drawer/drawer-content.svelte b/src/lib/components/ui/drawer/drawer-content.svelte new file mode 100644 index 00000000..b4d019f8 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-content.svelte @@ -0,0 +1,24 @@ + + + + + +
+ +
+
diff --git a/src/lib/components/ui/drawer/drawer-description.svelte b/src/lib/components/ui/drawer/drawer-description.svelte new file mode 100644 index 00000000..cc092ee9 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-description.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/lib/components/ui/drawer/drawer-footer.svelte b/src/lib/components/ui/drawer/drawer-footer.svelte new file mode 100644 index 00000000..da35d000 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/src/lib/components/ui/drawer/drawer-header.svelte b/src/lib/components/ui/drawer/drawer-header.svelte new file mode 100644 index 00000000..1c3aa361 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-header.svelte @@ -0,0 +1,19 @@ + + +
+ +
diff --git a/src/lib/components/ui/drawer/drawer-nested.svelte b/src/lib/components/ui/drawer/drawer-nested.svelte new file mode 100644 index 00000000..de5e96ac --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-nested.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/src/lib/components/ui/drawer/drawer-overlay.svelte b/src/lib/components/ui/drawer/drawer-overlay.svelte new file mode 100644 index 00000000..c7221098 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-overlay.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/lib/components/ui/drawer/drawer-title.svelte b/src/lib/components/ui/drawer/drawer-title.svelte new file mode 100644 index 00000000..95299866 --- /dev/null +++ b/src/lib/components/ui/drawer/drawer-title.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/lib/components/ui/drawer/drawer.svelte b/src/lib/components/ui/drawer/drawer.svelte new file mode 100644 index 00000000..2ac8ce5e --- /dev/null +++ b/src/lib/components/ui/drawer/drawer.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/src/lib/components/ui/drawer/index.ts b/src/lib/components/ui/drawer/index.ts new file mode 100644 index 00000000..dd39b2a5 --- /dev/null +++ b/src/lib/components/ui/drawer/index.ts @@ -0,0 +1,41 @@ +import { Drawer as DrawerPrimitive } from 'vaul-svelte'; + +import Root from './drawer.svelte'; +import Content from './drawer-content.svelte'; +import Description from './drawer-description.svelte'; +import Overlay from './drawer-overlay.svelte'; +import Footer from './drawer-footer.svelte'; +import Header from './drawer-header.svelte'; +import Title from './drawer-title.svelte'; +import NestedRoot from './drawer-nested.svelte'; + +const Trigger = DrawerPrimitive.Trigger; +const Portal = DrawerPrimitive.Portal; +const Close = DrawerPrimitive.Close; + +export { + Root, + NestedRoot, + Content, + Description, + Overlay, + Footer, + Header, + Title, + Trigger, + Portal, + Close, + + // + Root as Drawer, + NestedRoot as DrawerNestedRoot, + Content as DrawerContent, + Description as DrawerDescription, + Overlay as DrawerOverlay, + Footer as DrawerFooter, + Header as DrawerHeader, + Title as DrawerTitle, + Trigger as DrawerTrigger, + Portal as DrawerPortal, + Close as DrawerClose +}; diff --git a/src/lib/components/ui/icon-button/IconButton.svelte b/src/lib/components/ui/icon-button/IconButton.svelte index 9dd7a673..53492e87 100644 --- a/src/lib/components/ui/icon-button/IconButton.svelte +++ b/src/lib/components/ui/icon-button/IconButton.svelte @@ -1,8 +1,9 @@ diff --git a/src/lib/components/ui/icon/icon.svelte b/src/lib/components/ui/icon/icon.svelte index c93a4ef7..cb3fd67d 100644 --- a/src/lib/components/ui/icon/icon.svelte +++ b/src/lib/components/ui/icon/icon.svelte @@ -1,75 +1,13 @@ - - {#if title} - {title} - {/if} - {#if spin !== false} - {#if inverse} - - {:else} - - {/if} - - - - {:else} - - {/if} + +
+
import { Popover as PopoverPrimitive } from 'bits-ui'; - import { cn, flyAndScale } from '$lib/utils'; + import { cn, flyAndScale } from '$lib/utils.js'; type $$Props = PopoverPrimitive.ContentProps; let className: $$Props['class'] = undefined; @@ -10,13 +10,13 @@ diff --git a/src/lib/components/ui/progress/progress.svelte b/src/lib/components/ui/progress/progress.svelte index e3555c90..d9791c2c 100644 --- a/src/lib/components/ui/progress/progress.svelte +++ b/src/lib/components/ui/progress/progress.svelte @@ -1,13 +1,14 @@
+

+ {value}/{max} + {`(${percent}%)`} +

diff --git a/src/lib/components/ui/pull-chip/PullChip.svelte b/src/lib/components/ui/pull-chip/PullChip.svelte index 68aac3bf..9b6adb0d 100644 --- a/src/lib/components/ui/pull-chip/PullChip.svelte +++ b/src/lib/components/ui/pull-chip/PullChip.svelte @@ -1,19 +1,23 @@ -
+
{'Image {name} {counter} diff --git a/src/lib/components/ui/scroll-area/index.ts b/src/lib/components/ui/scroll-area/index.ts new file mode 100644 index 00000000..d5468067 --- /dev/null +++ b/src/lib/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from './scroll-area-scrollbar.svelte'; +import Root from './scroll-area.svelte'; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar +}; diff --git a/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 00000000..adb10280 --- /dev/null +++ b/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,27 @@ + + + + + + diff --git a/src/lib/components/ui/scroll-area/scroll-area.svelte b/src/lib/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 00000000..e99a1529 --- /dev/null +++ b/src/lib/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,32 @@ + + + + + + + + + {#if orientation === 'vertical' || orientation === 'both'} + + {/if} + {#if orientation === 'horizontal' || orientation === 'both'} + + {/if} + + diff --git a/src/lib/components/ui/searchbar/Searchbar.svelte b/src/lib/components/ui/searchbar/Searchbar.svelte index a06f4521..8c90fe31 100644 --- a/src/lib/components/ui/searchbar/Searchbar.svelte +++ b/src/lib/components/ui/searchbar/Searchbar.svelte @@ -22,6 +22,10 @@ const opencmd = () => { open = true; }; + + const encodeAltText = (name: string) => { + return name.replace(/"/g, '"'); + }; {#each searchableDataList as data} { - redirectToPage(data.link); - }} + onSelect={() => redirectToPage(data.link)} class="cursor-pointer hover:bg-primary hover:text-black" > {'Image - {data.name} + {encodeAltText(data.name)} {/each} diff --git a/src/lib/components/ui/toggle-group/index.ts b/src/lib/components/ui/toggle-group/index.ts index d9aef03a..62a45115 100644 --- a/src/lib/components/ui/toggle-group/index.ts +++ b/src/lib/components/ui/toggle-group/index.ts @@ -1,8 +1,8 @@ import type { VariantProps } from 'tailwind-variants'; -import type { toggleVariants } from '$lib/components/ui/toggle'; import { getContext, setContext } from 'svelte'; import Root from './toggle-group.svelte'; import Item from './toggle-group-item.svelte'; +import type { toggleVariants } from '$lib/components/ui/toggle/index.js'; export type ToggleVariants = VariantProps; diff --git a/src/lib/components/ui/toggle-group/toggle-group-item.svelte b/src/lib/components/ui/toggle-group/toggle-group-item.svelte index bc142736..d86212a6 100644 --- a/src/lib/components/ui/toggle-group/toggle-group-item.svelte +++ b/src/lib/components/ui/toggle-group/toggle-group-item.svelte @@ -1,8 +1,8 @@ + +
+ {#if Object.keys(errors).length > 0} + + + Error + + Please correct the errors in the form before submitting. + + + {/if} +
+ + + {#if errors.uid} +

{errors.uid}

+ {/if} +
+

Add configuration information (optional)

+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ +
+ {#each languages as lang} + + {/each} +
+
+ +
+ +
+
diff --git a/src/lib/locales/CS.json b/src/lib/locales/CS.json new file mode 100644 index 00000000..d5dba4a5 --- /dev/null +++ b/src/lib/locales/CS.json @@ -0,0 +1,212 @@ +{ + "translation": { + "action.more": "View more", + "action.hide": "Hide", + "action.previous": "Previous", + "action.next": "Next", + "action.select_file": "Select File", + "action.yes": "Yes", + "action.no": "No", + "action.confirm": "Confirm", + "action.cancel": "Cancel", + "action.sort_by": "Sort By: {{sortFN}}", + "action.filter_by": "Filter By", + "navigation.category.collection": "Your collection", + "navigation.category.trackers": "Trackers", + "navigation.category.tools": "Tools", + "navigation.languageswitcher.title": "Choose your language", + "navigation.login": "Login or register", + "navigation.logout": "Logout", + "error.title": "Error", + "dashboard.title": "Dashboard", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Edit", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", + "wish.detailed.title.WeaponEvent": "Weapon banner history", + "wish.detailed.title.Standard": "Standard banner history", + "wish.detailed.title.CharacterEvent": "Character banner history", + "wish.detailed.title.Beginner": "Beginner banner history", + "wish.detailed.title.Chronicled": "Chronicled banner history", + "wish.detailed.info.total_pull_count": "Total pulls", + "wish.detailed.info.total_pull_percentage": "% of total pulls", + "wish.detailed.info.pity": "Pity", + "wish.overview.title": "Wish statistics", + "wish.overview.import_wish_button": "Import wishes", + "wish.overview.global_statistic_button": "Global statistics", + "wish.overview.info.total_pull_count": "Total pulls", + "wish.overview.info.total_pull_percentage": "% of total pulls", + "wish.overview.info.pity": "Pity", + "wish.overview.card.title.WeaponEvent": "Weapon", + "wish.overview.card.title.Standard": "Standard", + "wish.overview.card.title.CharacterEvent": "Character", + "wish.overview.card.title.Beginner": "Beginner", + "wish.overview.card.title.Chronicled": "Chronicled", + "wish.overview.card.latest_pulls.title": "Latest 5* pulls", + "wish.overview.card.latest_pulls.no_pulls.title": "Come back later", + "wish.overview.card.latest_pulls.no_pulls.description": "You haven't pulled a 5* on this banner yet", + "wish.import.title": "Import wishes", + "wish.import.instructions.step1": "Open Genshin Impact on PC (if you use multiple accounts, please restart the game).", + "wish.import.instructions.step2": "Open wish history page and wait for it to load completely.", + "wish.import.instructions.step3": "Close the game.", + "wish.import.instructions.step4": "Open the folder where the game is installed (Example: default is \"C:\\Program Files\\Genshin Impact\"). You can find the location of this folder by opening the launcher -> Settings -> Game Resources -> Installation Location", + "wish.import.instructions.step5": "Open folder \"Genshin Impact game\" -> \"GenshinImpact_Data\" -> \"webCaches\" -> \"2.24.0.0\" -> \"Cache\" -> \"CacheData\"", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", + "wish.import.state.error.title": "Something went wrong. Please try again later.", + "wish.import.state.queued.title": "Your request is waiting to be processed", + "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", + "wish.import.state.active.title": "Your request is being processed", + "wish.import.state.completed.title": "Your request was completed and your wishes were imported", + "wish.import.state.completed.description": "You will be able to import wishes again on {{date}}", + "characters.overview.title": "Characters", + "characters.detailed.tab.stats.title": "Stats", + "characters.detailed.tab.talents.title": "Talents", + "characters.detailed.tab.constellations.title": "Constellations", + "characters.detailed.category.builds.title": "Builds", + "characters.detailed.category.builds.view_on_kqm_button": "View on KQM", + "characters.detailed.category.builds.weapons.title": "Weapon", + "characters.detailed.category.builds.artifacts.title": "Artifacts", + "characters.detailed.category.builds.artifacts.main_stats.title": "Main Stats", + "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", + "characters.detailed.category.builds.talents.title": "Talents", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", + "settings.overview.title": "Settings", + "settings.category.theming.title": "Theming", + "settings.category.data.title": "Data", + "settings.category.data.import_data_button": "Import data", + "settings.category.data.export_data_button": "Export data", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", + "settings.import.title": "Import account data", + "settings.import.no_file_selected": "No file selected", + "settings.import.warning.title": "Watch out!", + "settings.import.warning.description": "Merging data can provoke unexpected errors", + "settings.import.start_import_button": "Start import", + "settings.import.confirmation_dialog.title": "Are you sure?", + "settings.import.confirmation_dialog.description": "Dvalin will try to merge your imported data with the current data. If you see any error please report it on the discord channel", + "settings.category.danger_zone.title": "Dangerzone", + "login.title": "Be able to do more with an account!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", + "login.perk.cross_device_sync.title": "Cross-device synchronization", + "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.server_access.title": "Access to server side functions", + "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.personal_profile.title": "Share your personal profile", + "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "map.title": "Map", + "todo.title": "To-Do", + "inventory.title": "Inventory", + "weapons.title": "Weapons", + "chart.rarity_distribution.title": "Rarity distribution", + "chart.wish_distribution_time.title": "Wish distribution over time", + "table.banner_history.date": "Date", + "table.banner_history.type": "Type", + "table.banner_history.name": "Name", + "table.banner_history.rarity": "Rarity", + "table.banner_history.pity": "Pity", + "theme.dark.title": "Dark", + "theme.light.title": "Light", + "server.wish_history.active": "Your wish history is now being processed", + "server.wish_history.success": "Your wish history was successfully imported", + "server.wish_history.error": "Your wish history failed to import", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", + "language.DE": "Deutsch", + "language.EN": "English", + "language.ES": "Español", + "language.FR": "Français", + "language.IT": "Italiano", + "language.PL": "Polski", + "language.PT": "Português", + "language.RU": "Русский", + "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", + "language.ZHS": "简体中文", + "language.ZHT": "繁體中文" + } +} diff --git a/src/lib/locales/DE.json b/src/lib/locales/DE.json index be7dbe5f..b9251292 100644 --- a/src/lib/locales/DE.json +++ b/src/lib/locales/DE.json @@ -8,6 +8,7 @@ "action.yes": "Ja", "action.no": "Nein", "action.confirm": "Bestätigen", + "action.cancel": "Abbrechen", "action.sort_by": "Sortieren nach: {{sortFN}}", "action.filter_by": "Filtern nach", "navigation.category.collection": "Deine Sammlung", @@ -18,6 +19,52 @@ "navigation.logout": "Abmelden", "error.title": "Fehler", "dashboard.title": "Startseite", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Bearbeiten", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Verlauf des Waffengebets", "wish.detailed.title.Standard": "Verlauf des Standartgebets", "wish.detailed.title.CharacterEvent": "Verlauf des Charaktergebets", @@ -46,6 +93,10 @@ "wish.import.instructions.step3": "Öffne nun die neu erstellte Datei \"data_2\"", "wish.import.instructions.step4": "Suche nach dem letzten Eintrag von \"e20190909gacha-v3\" (ohne Gänsefüßchen)", "wish.import.instructions.step5": "Kopiere den kompletten Link und füge ihn unten in das Textfeld ein", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Etwas ist fehlgeschlagen. Bitte versuche es später erneut.", "wish.import.state.queued.title": "Deine Anfrage befindet sich in der Warteschlange", "wish.import.state.queued.description": "Derzeit befinden sich {{count}} Anfragen in der Warteschlange", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Hauptwerte", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Talente", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", "settings.overview.title": "Einstellungen", "settings.category.theming.title": "Themen", "settings.category.data.title": "Daten", "settings.category.data.import_data_button": "Daten importieren", "settings.category.data.export_data_button": "Daten exportieren", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", "settings.import.title": "Accountdaten importieren", "settings.import.no_file_selected": "Keine Datei ausgewählt", "settings.import.warning.title": "Achtung!", - "settings.import.warning.description": "Deine bisherigen Daten werden überschrieben", + "settings.import.warning.description": "Das Zusammenführen von Daten kann unerwartete Fehler verursachen", "settings.import.start_import_button": "Importieren", "settings.import.confirmation_dialog.title": "Bist du dir sicher?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin wird versuchen, deine importierten und deine aktuellen Daten zusammenzuführen. Wenn du einen Fehler bemerkst, melde ihn bitte auf dem Discord Channel", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Mache mehr mit einem Account!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", "login.perk.cross_device_sync.title": "Geräteübergreifende Synchronisation", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Zugriff auf serverseitige Funktionen", @@ -98,6 +172,30 @@ "server.wish_history.active": "Dein Gebetsverlauf wird nun importiert", "server.wish_history.success": "Dein Gebetsverlauf wurde erfolgreich importiert", "server.wish_history.error": "Dein Gebetsverlauf konnte nicht importiert werden", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/EN.json b/src/lib/locales/EN.json index 8b414423..d5dba4a5 100644 --- a/src/lib/locales/EN.json +++ b/src/lib/locales/EN.json @@ -8,6 +8,7 @@ "action.yes": "Yes", "action.no": "No", "action.confirm": "Confirm", + "action.cancel": "Cancel", "action.sort_by": "Sort By: {{sortFN}}", "action.filter_by": "Filter By", "navigation.category.collection": "Your collection", @@ -18,6 +19,52 @@ "navigation.logout": "Logout", "error.title": "Error", "dashboard.title": "Dashboard", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Edit", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Weapon banner history", "wish.detailed.title.Standard": "Standard banner history", "wish.detailed.title.CharacterEvent": "Character banner history", @@ -41,11 +88,15 @@ "wish.overview.card.latest_pulls.no_pulls.title": "Come back later", "wish.overview.card.latest_pulls.no_pulls.description": "You haven't pulled a 5* on this banner yet", "wish.import.title": "Import wishes", - "wish.import.instructions.step1": "Navigate to folder \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", - "wish.import.instructions.step2": "Delete file \"data_2\", open the game and view your wish history", - "wish.import.instructions.step3": "Open file \"data_2\"", - "wish.import.instructions.step4": "Search for the last entry of \"e20190909gacha-v3\" (without quotes)", - "wish.import.instructions.step5": "Copy the link and paste it into the text field", + "wish.import.instructions.step1": "Open Genshin Impact on PC (if you use multiple accounts, please restart the game).", + "wish.import.instructions.step2": "Open wish history page and wait for it to load completely.", + "wish.import.instructions.step3": "Close the game.", + "wish.import.instructions.step4": "Open the folder where the game is installed (Example: default is \"C:\\Program Files\\Genshin Impact\"). You can find the location of this folder by opening the launcher -> Settings -> Game Resources -> Installation Location", + "wish.import.instructions.step5": "Open folder \"Genshin Impact game\" -> \"GenshinImpact_Data\" -> \"webCaches\" -> \"2.24.0.0\" -> \"Cache\" -> \"CacheData\"", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Something went wrong. Please try again later.", "wish.import.state.queued.title": "Your request is waiting to be processed", "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Main Stats", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Talents", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", "settings.overview.title": "Settings", "settings.category.theming.title": "Theming", "settings.category.data.title": "Data", "settings.category.data.import_data_button": "Import data", "settings.category.data.export_data_button": "Export data", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", "settings.import.title": "Import account data", "settings.import.no_file_selected": "No file selected", "settings.import.warning.title": "Watch out!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "Merging data can provoke unexpected errors", "settings.import.start_import_button": "Start import", "settings.import.confirmation_dialog.title": "Are you sure?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin will try to merge your imported data with the current data. If you see any error please report it on the discord channel", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Be able to do more with an account!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", "login.perk.cross_device_sync.title": "Cross-device synchronization", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Access to server side functions", @@ -98,6 +172,30 @@ "server.wish_history.active": "Your wish history is now being processed", "server.wish_history.success": "Your wish history was successfully imported", "server.wish_history.error": "Your wish history failed to import", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/ES.json b/src/lib/locales/ES.json index ca7af94b..210a51c4 100644 --- a/src/lib/locales/ES.json +++ b/src/lib/locales/ES.json @@ -1,15 +1,16 @@ { "translation": { - "action.more": "View more", - "action.hide": "Hide", - "action.previous": "Previous", - "action.next": "Next", - "action.select_file": "Select File", - "action.yes": "Yes", + "action.more": "Ver más", + "action.hide": "Ocultar", + "action.previous": "Anterior", + "action.next": "Siguiente", + "action.select_file": "Seleccionar archivo", + "action.yes": "Sí", "action.no": "No", - "action.confirm": "Confirm", + "action.confirm": "Confirmar", + "action.cancel": "Cancelar", "action.sort_by": "Ordenar por", - "action.filter_by": "Filter By", + "action.filter_by": "Filtrar por", "navigation.category.collection": "Tu colección", "navigation.category.trackers": "Seguimiento", "navigation.category.tools": "Herramientas", @@ -18,6 +19,52 @@ "navigation.logout": "Cerrar sesión", "error.title": "Error", "dashboard.title": "Inicio", + "dashboard.welcome.title": "¡Bienvenido a Dval.in!", + "dashboard.welcome.message": "¡Tu mejor compañero en Genshin Impact! Dval.in te ayuda a planear qué materiales farmear con una calculadora de ascensión, y registra tu progreso con una lista de tareas pendientes y un contador de deseos.", + "dashboard.edit_layout.button": "Editar", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Weapon banner history", "wish.detailed.title.Standard": "Standard banner history", "wish.detailed.title.CharacterEvent": "Character banner history", @@ -41,11 +88,15 @@ "wish.overview.card.latest_pulls.no_pulls.title": "Come back later", "wish.overview.card.latest_pulls.no_pulls.description": "You haven't pulled a 5* on this banner yet", "wish.import.title": "Import wishes", - "wish.import.instructions.step1": "Navigate to folder \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", - "wish.import.instructions.step2": "Delete file \"data_2\", open the game and view your wish history", - "wish.import.instructions.step3": "Open file \"data_2\"", - "wish.import.instructions.step4": "Search for the last entry of \"e20190909gacha-v3\" (without quotes)", - "wish.import.instructions.step5": "Copy the link and paste it into the text field", + "wish.import.instructions.step1": "Open Genshin Impact on PC (if you use multiple accounts, please restart the game).", + "wish.import.instructions.step2": "Open wish history page and wait for it to load completely.", + "wish.import.instructions.step3": "Close the game.", + "wish.import.instructions.step4": "Open the folder where the game is installed (Example: default is \"C:\\Program Files\\Genshin Impact\"). You can find the location of this folder by opening the launcher -> Settings -> Game Resources -> Installation Location", + "wish.import.instructions.step5": "Open folder \"Genshin Impact game\" -> \"GenshinImpact_Data\" -> \"webCaches\" -> \"2.24.0.0\" -> \"Cache\" -> \"CacheData\"", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Something went wrong. Please try again later.", "wish.import.state.queued.title": "Your request is waiting to be processed", "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Main Stats", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Talents", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", "settings.overview.title": "Configuración", "settings.category.theming.title": "Theming", "settings.category.data.title": "Data", "settings.category.data.import_data_button": "Import data", "settings.category.data.export_data_button": "Export data", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", "settings.import.title": "Import account data", "settings.import.no_file_selected": "No file selected", "settings.import.warning.title": "Watch out!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "Merging data can provoke unexpected errors", "settings.import.start_import_button": "Start import", "settings.import.confirmation_dialog.title": "Are you sure?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin will try to merge your imported data with the current data. If you see any error please report it on the discord channel", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Be able to do more with an account!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", "login.perk.cross_device_sync.title": "Cross-device synchronization", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Access to server side functions", @@ -84,7 +158,7 @@ "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "map.title": "Mapa interactivo", "todo.title": "Tareas pendientes", - "inventory.title": "Inventorio", + "inventory.title": "Inventario", "weapons.title": "Armas", "chart.rarity_distribution.title": "Rarity distribution", "chart.wish_distribution_time.title": "Wish distribution over time", @@ -98,6 +172,30 @@ "server.wish_history.active": "Your wish history is now being processed", "server.wish_history.success": "Your wish history was successfully imported", "server.wish_history.error": "Your wish history failed to import", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/FR.json b/src/lib/locales/FR.json index 66fce05c..c3dd0fb5 100644 --- a/src/lib/locales/FR.json +++ b/src/lib/locales/FR.json @@ -8,7 +8,8 @@ "action.yes": "Oui", "action.no": "Non", "action.confirm": "Confirmer", - "action.sort_by": "Trier par", + "action.cancel": "Annuler", + "action.sort_by": "Trier par : {{sortFN}}", "action.filter_by": "Filtrer par", "navigation.category.collection": "Votre collection", "navigation.category.trackers": "Suivi", @@ -18,19 +19,65 @@ "navigation.logout": "Déconnexion", "error.title": "Erreur", "dashboard.title": "Tableau de bord", + "dashboard.welcome.title": "Bienvenue sur Dval.in !", + "dashboard.welcome.message": "Votre meilleur ami pour Genshin Impact ! Dval.in vous aide à organiser votre farm avec un calculateur d'amélioration et suit votre progression avec un planificateur et un compteur de vœux.", + "dashboard.edit_layout.button": "Modifier", + "dashboard.edit_layout.title": "Modifier la mise en page", + "dashboard.edit_layout.description": "Modifiez la page d'accueil selon vos besoins.", + "dashboard.widget.changelog.title": "Journal des modifications", + "dashboard.widget.reminder.title": "Rappel", + "dashboard.widget.reminder.daily": "Quotidiens", + "dashboard.widget.reminder.daily.teapot_currency": "Pièces du royaume et EXP d'affinité", + "dashboard.widget.reminder.daily.commissions": "Quêtes quotidiennes", + "dashboard.widget.reminder.daily.resin": "Résine à dépenser", + "dashboard.widget.reminder.daily.welkin": "Faveur de l'astre", + "dashboard.widget.reminder.two_day.title": "Tous les 2 jours", + "dashboard.widget.reminder.two_day.local_specialties": "Produits régionaux", + "dashboard.widget.reminder.two_day.ores": "Minerais", + "dashboard.widget.reminder.three_day.title": "Tous les 3 jours", + "dashboard.widget.reminder.three_day.crystals": "Morceaux de cristal", + "dashboard.widget.reminder.three_day.teapot_farm": "Plantes à récolter", + "dashboard.widget.reminder.three_day.fishing": "Pêche", + "dashboard.widget.reminder.weekly.title": "Hebdomadaires", + "dashboard.widget.reminder.weekly.parametric_transformer": "Transformateur paramétrique", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Piège à papillons cristallins", + "dashboard.widget.reminder.weekly.bosses": "Boss hebdomadaires", + "dashboard.widget.reminder.weekly.reputation": "Primes et requêtes", + "dashboard.widget.events.title": "Évènements en cours", + "dashboard.widget.events.version": "Pour la version", + "dashboard.widget.events.timeline.button": "Voir le calendrier", + "dashboard.widget.todo.title": "Planificateur", + "dashboard.widget.domain.title": "Farmable aujourd'hui", + "dashboard.widget.achievements.title": "Succès", + "dashboard.widget.achievements.progress": "Progression globale", + "dashboard.widget.achievements.latest": "Derniers succès", + "dashboard.widget.achievements.more": "Voir plus de succès", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Statistiques de vœux", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total des vœux", + "dashboard.widget.wishing.latest": "Derniers vœux", + "dashboard.widget.display.title": "Affichage", + "dashboard.widget.global_wishing.title": "Statistiques globales", + "dashboard.widget.global_wishing.percentage": "de tous les", + "dashboard.widget.global_wishing.pity_average": "Pity moyenne", + "dashboard.widget.global_wishing.based_on": "à partir de {{number}} contributions", + "dashboard.widget.resin.title": "Suivi de résine", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "min", "wish.detailed.title.WeaponEvent": "Historique de la bannière d'armes", - "wish.detailed.title.Standard": "Historique de la bannière permantente", + "wish.detailed.title.Standard": "Historique de la bannière permanente", "wish.detailed.title.CharacterEvent": "Historique de la bannière de personnages", "wish.detailed.title.Beginner": "Historique de la bannière du débutant", "wish.detailed.title.Chronicled": "Historique de la bannière nostalgie", - "wish.detailed.info.total_pull_count": "Total des voeux", - "wish.detailed.info.total_pull_percentage": "% du total des voeux", + "wish.detailed.info.total_pull_count": "Total des vœux", + "wish.detailed.info.total_pull_percentage": "% du total des vœux", "wish.detailed.info.pity": "Pity", "wish.overview.title": "Statistiques des vœux", - "wish.overview.import_wish_button": "Importer les voeux", + "wish.overview.import_wish_button": "Importer les vœux", "wish.overview.global_statistic_button": "Statistiques globales", - "wish.overview.info.total_pull_count": "Total des voeux", - "wish.overview.info.total_pull_percentage": "% du total des voeux", + "wish.overview.info.total_pull_count": "Total des vœux", + "wish.overview.info.total_pull_percentage": "% du total des vœux", "wish.overview.info.pity": "Pity", "wish.overview.card.title.WeaponEvent": "Armes", "wish.overview.card.title.Standard": "Permanente", @@ -38,20 +85,24 @@ "wish.overview.card.title.Beginner": "Débutant", "wish.overview.card.title.Chronicled": "Nostalgie", "wish.overview.card.latest_pulls.title": "Derniers 5* obtenus", - "wish.overview.card.latest_pulls.no_pulls.title": "Merci de revenir plus tard", + "wish.overview.card.latest_pulls.no_pulls.title": "Veuillez revenir plus tard", "wish.overview.card.latest_pulls.no_pulls.description": "Aucun 5* obtenu sur cette bannière", - "wish.import.title": "Importer les voeux", - "wish.import.instructions.step1": "Ouvrir le dossier \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", - "wish.import.instructions.step2": "Effacer le fichier \"data_2\", ouvrir le jeu puis la page d'historique de voeux", + "wish.import.title": "Importer les vœux", + "wish.import.instructions.step1": "Ouvrir le dossier : \"C:\\Programmes\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%dernière\n\t\t\t\tversion%\\Cache\\Cache_Data\"", + "wish.import.instructions.step2": "Effacer le fichier \"data_2\", ouvrir le jeu puis la page d'historique de vœux", "wish.import.instructions.step3": "Ouvrir le fichier \"data_2\"", "wish.import.instructions.step4": "Chercher la dernière entrée de \"e20190909gacha-v3\" (sans les guillemets)", "wish.import.instructions.step5": "Copier le lien et le coller dans la zone de texte", - "wish.import.state.error.title": "Une erreur s'est produite. Merci de réessayer plus tard.", - "wish.import.state.queued.title": "La requête est en cours de traitement", - "wish.import.state.queued.description": "Il y a actuellement {{count}} requêtes dans la file d'attente", - "wish.import.state.active.title": "La requête est en cours de traitement", - "wish.import.state.completed.title": "Requête traitée. Les voeux ont été importés.", - "wish.import.state.completed.description": "Prochaine importation de voeux possible le {{date}}", + "wish.import.instructions.step6": "Faire un clic droit sur le fichier \"data_2\", cliquer sur \"Ouvrir avec\", puis sélectionner le Bloc-notes.", + "wish.import.instructions.step7": "Faire Ctrl + F et sélectionner \"Continuer automatiquement\" dans \"Plus d'options\". Taper ensuite e20190909gacha-v3 dans la boîte de texte et choisir de rechercher vers le haut.", + "wish.import.instructions.step8": "Copier le lien entier allant de \"https://public-operation\" à \"game_biz=hk4e_global\". Le lien ressemble à : \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\".", + "wish.import.instructions.step9": "Coller le lien dans la boîte de texte ci-dessous.", + "wish.import.state.error.title": "Une erreur s'est produite. Veuillez réessayer plus tard.", + "wish.import.state.queued.title": "La requête est dans la file d'attente.", + "wish.import.state.queued.description": "Il y a actuellement {{count}} requêtes dans la file d'attente.", + "wish.import.state.active.title": "La requête est en cours de traitement.", + "wish.import.state.completed.title": "Requête traitée. Les vœux ont été importés.", + "wish.import.state.completed.description": "Prochaine importation de vœux possible le {{date}}.", "characters.overview.title": "Personnages", "characters.detailed.tab.stats.title": "Stats", "characters.detailed.tab.talents.title": "Aptitudes", @@ -60,34 +111,57 @@ "characters.detailed.category.builds.view_on_kqm_button": "Voir sur KQM", "characters.detailed.category.builds.weapons.title": "Armes", "characters.detailed.category.builds.artifacts.title": "Artéfacts", - "characters.detailed.category.builds.artifacts.main_stats.title": "Stats principales", + "characters.detailed.category.builds.artifacts.main_stats.title": "Main stats", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Aptitudes", + "welcome.title": "Bienvenue, Voyageur !", + "profile.complete.title": "Complétez votre profil pour débloquer toutes les fonctionnalités", + "profile.complete.description": "En complétant votre profil, vous aurez accès à des fonctionnalités améliorées et à une expérience personnalisée. Une fois connecté(e), vous pourrez importer des données de différentes sources et exporter vos informations en toute sécurité.", + "profile.create.success": "Profil créé avec succès !", + "profile.create.error": "Erreur lors de la création du profil : {error}", + "profile.create.pending.title": "Création de votre profil", + "profile.create.pending.description": "Veuillez patienter pendant que nous configurons votre expérience personnalisée...", + "profile.create.error.title": "Erreur lors de la création du profil", "settings.overview.title": "Paramètres", "settings.category.theming.title": "Thèmes", "settings.category.data.title": "Données", "settings.category.data.import_data_button": "Importer les données", "settings.category.data.export_data_button": "Exporter les données", + "settings.login_providers": "Fournisseurs d'accès", + "settings.auto_refine_settings": "Paramètres de raffinement automatique", + "settings.auto_refine_3_star": "Raffiner automatiquement les armes 3 étoiles", + "settings.auto_refine_4_star": "Raffiner automatiquement les armes 4 étoiles", + "settings.auto_refine_5_star": "Raffiner automatiquement les armes 5 étoiles", + "settings.save_settings": "Sauvegarder les paramètres", + "settings.delete_account": "Supprimer le compte", + "settings.delete_account_confirmation": "Êtes-vous sûr(e) de vouloir supprimer votre compte ? Cette action est irréversible et toutes vos données seront définitivement perdues.", + "settings.delete_account_confirm": "Supprimer le compte", + "settings.import.pending": "Importation des données. Veuillez patienter...", + "settings.import.success.title": "Importation réussie !", + "settings.import.success.description": "Vos données ont été envoyées au serveur et seront traitées prochainement. Vous serez redirigé(e) vers la page des paramètres.", "settings.import.title": "Importation des données de compte", "settings.import.no_file_selected": "Aucun fichier sélectionné", "settings.import.warning.title": "Attention !", - "settings.import.warning.description": "Cette action va supprimer les données existantes", + "settings.import.warning.description": "La fusion des données peut causer des erreurs inattendues.", "settings.import.start_import_button": "Commencer l'importation", "settings.import.confirmation_dialog.title": "Êtes-vous sûr(e)?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dval.in va tenter de fusionner les données importées avec les données actuelles. Si vous voyez une erreur, veuillez la signaler sur le serveur Discord.", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Plus de fonctionnalités disponibles avec un compte !", + "login.alert.title": "Important : Information sur les données locales", + "login.alert.description": "La connexion écrasera vos données locales. Veuillez vous assurer que vous avez sauvegardé toutes les informations importantes avant de continuer.", "login.perk.cross_device_sync.title": "Synchronisation entre les appareils", - "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde ?", "login.perk.server_access.title": "Accès aux fonctions annexes du serveur", - "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde ?", "login.perk.personal_profile.title": "Partage du profil", - "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde ?", "map.title": "Carte", "todo.title": "Planificateur", "inventory.title": "Inventaire", "weapons.title": "Armes", "chart.rarity_distribution.title": "Répartition de la rareté", - "chart.wish_distribution_time.title": "Répartition des voeux au cours du temps", + "chart.wish_distribution_time.title": "Répartition des vœux au cours du temps", "table.banner_history.date": "Date", "table.banner_history.type": "Type", "table.banner_history.name": "Nom", @@ -95,9 +169,33 @@ "table.banner_history.pity": "Pity", "theme.dark.title": "Sombre", "theme.light.title": "Clair", - "server.wish_history.active": "Traitement de l'historique de voeux en cours", - "server.wish_history.success": "Importation de l'historique de voeux réussie", - "server.wish_history.error": "Echec de l'importation de l'historique de voeux", + "server.wish_history.active": "Traitement de l'historique de vœux en cours", + "server.wish_history.success": "Importation de l'historique de vœux réussie", + "server.wish_history.error": "Échec de l'importation de l'historique de vœux", + "action.reset_filters": "Réinitialiser les filtres", + "filter.element": "Élément", + "filter.weapon": "Arme", + "sort.rarity": "Rareté", + "sort.name": "Nom", + "sort.count": "Nombre", + "sort.owned": "Possédé", + "sort.date": "Date", + "weapons.overview.title": "Armes", + "weapons.detailed.tab.refinement.title": "Raffinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Matériaux", + "weapons.title.inventory": "Dans votre inventaire", + "sort.constellation": "Constellation", + "achievement.title": "Succès", + "achievement.filter.all": "Aucun filtre", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Caché", + "achievement.more_info": "Plus d'infos", + "achievement.unachieved": "Afficher les succès non-débloqués en premier", + "achievement.check_all": "Voir tous les succès", + "achievement.show_unachived_category": "Afficher les catégories incomplètes", + "rarity": "Rareté", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/IT.json b/src/lib/locales/IT.json index 2dd42d9b..1460721b 100644 --- a/src/lib/locales/IT.json +++ b/src/lib/locales/IT.json @@ -1,6 +1,6 @@ { "translation": { - "action.more": "Visualizza altri", + "action.more": "Visualizza altro", "action.hide": "Nascondi", "action.previous": "Precedente", "action.next": "Successivo", @@ -8,16 +8,63 @@ "action.yes": "Sì", "action.no": "No", "action.confirm": "Conferma", + "action.cancel": "Cancella", "action.sort_by": "Ordina per", "action.filter_by": "Filtra per", "navigation.category.collection": "La tua collezione", - "navigation.category.trackers": "Trackers", + "navigation.category.trackers": "Tracker", "navigation.category.tools": "Strumenti", "navigation.languageswitcher.title": "Seleziona la tua lingua", "navigation.login": "Accedi o Registrati", "navigation.logout": "Esci", "error.title": "Errore", - "dashboard.title": "Pannello di Controllo", + "dashboard.title": "Dashboard", + "dashboard.welcome.title": "Benvenuto su Dval.in!", + "dashboard.welcome.message": "Il tuo compagno preferito di Genshin Impact. Dval.in aiuta a pianificare cosa farmare con un calcolatore per ascensioni, e aiuta a tener traccia dei progressi con una lista e un contatore di desideri", + "dashboard.edit_layout.button": "Modifica", + "dashboard.edit_layout.title": "Modifica la grafica", + "dashboard.edit_layout.description": "Modifica la tua pagina principale, con ciò che ti serve!", + "dashboard.widget.changelog.title": "Registro modifiche", + "dashboard.widget.reminder.title": "Promemoria", + "dashboard.widget.reminder.daily": "Giornaliere", + "dashboard.widget.reminder.daily.teapot_currency": "Monete e Amicizia Teapot", + "dashboard.widget.reminder.daily.commissions": "Commissioni giornaliere", + "dashboard.widget.reminder.daily.resin": "Usa la resina", + "dashboard.widget.reminder.daily.welkin": "Benedizione Lunare del Firmamento", + "dashboard.widget.reminder.two_day.title": "Ogni 2 giorni", + "dashboard.widget.reminder.two_day.local_specialties": "Specialità locali", + "dashboard.widget.reminder.two_day.ores": "Minerali", + "dashboard.widget.reminder.three_day.title": "Ogni 3 giorni", + "dashboard.widget.reminder.three_day.crystals": "Pezzi di cristallo", + "dashboard.widget.reminder.three_day.teapot_farm": "Raccolta Materiali Teapot", + "dashboard.widget.reminder.three_day.fishing": "Pesca", + "dashboard.widget.reminder.weekly.title": "Boss settimanali", + "dashboard.widget.reminder.weekly.parametric_transformer": "Trasformatore parametrico", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Trappola per Cristallotteri", + "dashboard.widget.reminder.weekly.bosses": "Boss settimanali", + "dashboard.widget.reminder.weekly.reputation": "Reputazione Taglie", + "dashboard.widget.events.title": "Eventi in corso", + "dashboard.widget.events.version": "Per la versione", + "dashboard.widget.events.timeline.button": "Visualizza la cronologia", + "dashboard.widget.todo.title": "Lista delle cose da fare", + "dashboard.widget.domain.title": "Rotazioni Domini", + "dashboard.widget.achievements.title": "Obiettivi", + "dashboard.widget.achievements.progress": "Progressi complessivi", + "dashboard.widget.achievements.latest": "Obiettivi più recenti", + "dashboard.widget.achievements.more": "Visualizza altri obiettivi", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Statistiche dei desideri", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Desideri totali", + "dashboard.widget.wishing.latest": "Ultimi desideri", + "dashboard.widget.display.title": "Mostra", + "dashboard.widget.global_wishing.title": "Statistiche globali dei desideri", + "dashboard.widget.global_wishing.percentage": "di tutti", + "dashboard.widget.global_wishing.pity_average": "Pity Medio", + "dashboard.widget.global_wishing.based_on": "basato su {{number}} invii", + "dashboard.widget.resin.title": "Tracker resina", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Cronologia banner Armi", "wish.detailed.title.Standard": "Cronologia banner Standard", "wish.detailed.title.CharacterEvent": "Cronologia banner Personaggi", @@ -26,9 +73,9 @@ "wish.detailed.info.total_pull_count": "Pull Totali", "wish.detailed.info.total_pull_percentage": "% sulle Pull Totali", "wish.detailed.info.pity": "Pity", - "wish.overview.title": "Wish statistics", + "wish.overview.title": "Statistiche Desideri", "wish.overview.import_wish_button": "Importa Desideri", - "wish.overview.global_statistic_button": "Global statistics", + "wish.overview.global_statistic_button": "Statistiche globali", "wish.overview.info.total_pull_count": "Pull Totali", "wish.overview.info.total_pull_percentage": "% sulle Pull Totali", "wish.overview.info.pity": "Pity", @@ -37,20 +84,24 @@ "wish.overview.card.title.CharacterEvent": "Personaggi", "wish.overview.card.title.Beginner": "Principiante", "wish.overview.card.title.Chronicled": "Cronache", - "wish.overview.card.latest_pulls.title": "Ultimo 5*", + "wish.overview.card.latest_pulls.title": "Ultimi 5* ottenuti", "wish.overview.card.latest_pulls.no_pulls.title": "Torna più tardi", - "wish.overview.card.latest_pulls.no_pulls.description": "You haven't pulled a 5* on this banner yet", + "wish.overview.card.latest_pulls.no_pulls.description": "Non hai ancora ottenuto un 5* su questo banner", "wish.import.title": "Importa desideri", "wish.import.instructions.step1": "Vai alla cartella \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", "wish.import.instructions.step2": "Cancella la cartella \"data_2\", apri il gioco e guarda la tua cronologia dei desideri", "wish.import.instructions.step3": "Riapri la cartella \"data_2\"", "wish.import.instructions.step4": "Cerca l'ultimo file in \"e20190909gacha-v3\" (senza apici)", "wish.import.instructions.step5": "Copia il link e incollalo nella casella di testo", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Qualcosa è andato storto. Riprova più tardi.", - "wish.import.state.queued.title": "La tua richiesta è in fase di lavorazione", - "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", + "wish.import.state.queued.title": "La tua richiesta è in attesa di essere elaborata", + "wish.import.state.queued.description": "Al momento, ci sono {{count}} richieste in lista d'attesa", "wish.import.state.active.title": "La tua richiesta è in fase di lavorazione", - "wish.import.state.completed.title": "La tua richiesta è stata completata, e i tuoi desideri son stati importati", + "wish.import.state.completed.title": "La tua richiesta è stata completata, e i tuoi desideri sono stati importati", "wish.import.state.completed.description": "Potrai importare di nuovo i tuoi desideri il {{date}}", "characters.overview.title": "Personaggi", "characters.detailed.tab.stats.title": "Statistiche", @@ -58,27 +109,50 @@ "characters.detailed.tab.constellations.title": "Constellazioni", "characters.detailed.category.builds.title": "Build", "characters.detailed.category.builds.view_on_kqm_button": "Guarda su KQM (KeqingMains)", - "characters.detailed.category.builds.weapons.title": "Weapon", + "characters.detailed.category.builds.weapons.title": "Arma", "characters.detailed.category.builds.artifacts.title": "Artefatti", - "characters.detailed.category.builds.artifacts.main_stats.title": "Main Stats", - "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", + "characters.detailed.category.builds.artifacts.main_stats.title": "Statistiche Principali", + "characters.detailed.category.builds.artifacts.sub_stats.title": "Statistiche secondarie", "characters.detailed.category.builds.talents.title": "Talenti", + "welcome.title": "Benvenuto, Viaggiatore!", + "profile.complete.title": "Completa il tuo profilo per sbloccare tutte le funzionalità", + "profile.complete.description": "Completando il tuo profilo, potrai accedere a funzionalità avanzate ed esperienze personalizzate. Una volta effettuato l'accesso, sarai in grado di importare dati da varie fonti ed esportare la tue informazioni in sicurezza.", + "profile.create.success": "Profilo creato con successo!", + "profile.create.error": "Errore nella creazione del profilo: {error}", + "profile.create.pending.title": "Crea Il Tuo Profilo", + "profile.create.pending.description": "Si prega di attendere mentre configuriamo la tua esperienza personalizzata...", + "profile.create.error.title": "Errore Creazione Profilo", "settings.overview.title": "Impostazioni", "settings.category.theming.title": "Temi", "settings.category.data.title": "Dati", - "settings.category.data.import_data_button": "Import data", - "settings.category.data.export_data_button": "Export data", + "settings.category.data.import_data_button": "Importa dati", + "settings.category.data.export_data_button": "Esporta dati", + "settings.login_providers": "Provider di Autenticazione", + "settings.auto_refine_settings": "Impostazioni Miglioramenti automatici", + "settings.auto_refine_3_star": "Migliora automaticamente le armi 3 stelle", + "settings.auto_refine_4_star": "Migliora automaticamente le armi 4 stelle", + "settings.auto_refine_5_star": "Migliora automaticamente le armi 5 stelle", + "settings.save_settings": "Salva Impostazioni", + "settings.delete_account": "Elimina account", + "settings.delete_account_confirmation": "Sei sicuro di voler eliminare il tuo account? Questa azione è irreversibile e tutti i dati andranno persi.", + "settings.delete_account_confirm": "Elimina account", + "settings.import.pending": "Importazione dati, attendere prego...", + "settings.import.success.title": "Importazione completata con successo!", + "settings.import.success.description": "I tuoi dati sono stati inviati al server e saranno elaborati a breve. Sarai reindirizzato alla pagina delle impostazioni.", "settings.import.title": "Importa dati account", "settings.import.no_file_selected": "Nessun file selezionato", "settings.import.warning.title": "Stai attento!!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "Unire i dati può provocare errori imprevisti", "settings.import.start_import_button": "Inizio importazione", "settings.import.confirmation_dialog.title": "Sei sicuro?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin tenterà ad unire i dati importati con i tuoi dati attuali. Se noti qualche errore, per favore segnalalo sul canale Discord", + "settings.category.danger_zone.title": "Zona Pericolosa", "login.title": "Sii capace di fare di più col tuo account!", + "login.alert.title": "Importante: Avviso Dati Locali", + "login.alert.description": "L'accesso sovrascriverà i tuoi dati locali. Assicurati di aver eseguito il backup di tutte le informazioni importanti prima di procedere.", "login.perk.cross_device_sync.title": "Sincronizzazione Cross-Device", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", - "login.perk.server_access.title": "Accedi alle funzioni Lato-Server", + "login.perk.server_access.title": "Accedi alle funzioni lato server", "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.personal_profile.title": "Condividi il tuo profilo personale", "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", @@ -97,7 +171,31 @@ "theme.light.title": "Chiaro", "server.wish_history.active": "La tua cronologia desideri è in lavorazione", "server.wish_history.success": "La tua cronologia desideri è stata importata con successo", - "server.wish_history.error": "C'è stato un errore nell'importare la tua cronologia desideri", + "server.wish_history.error": "Importazione della cronologia desideri fallita", + "action.reset_filters": "Resetta filtri", + "filter.element": "Elemento", + "filter.weapon": "Arma", + "sort.rarity": "Rarity", + "sort.name": "Nome", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Data", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Costellazione", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Vietnamita", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/PL.json b/src/lib/locales/PL.json index 18fca94f..7c6f84eb 100644 --- a/src/lib/locales/PL.json +++ b/src/lib/locales/PL.json @@ -8,6 +8,7 @@ "action.yes": "Tak", "action.no": "Nie", "action.confirm": "Potwierdź", + "action.cancel": "Anuluj", "action.sort_by": "Sortuj według: {{sortFN}}", "action.filter_by": "Filtruj według", "navigation.category.collection": "Twoja kolekcja", @@ -17,40 +18,90 @@ "navigation.login": "Zaloguj się lub zarejestruj", "navigation.logout": "Wyloguj się", "error.title": "Błąd", - "dashboard.title": "Panel", + "dashboard.title": "Strona główna", + "dashboard.welcome.title": "Witaj na Dval.in!", + "dashboard.welcome.message": "Dval.in to twój najlepszy przyjaciel! Pomoże ci zaplanować co farmić dzięki kalkulatorowi. Śledzi również twój progres z check listą, a dodatkowo możesz sprawdzić historii wishy.", + "dashboard.edit_layout.button": "Edytuj", + "dashboard.edit_layout.title": "Edytuj wygląd", + "dashboard.edit_layout.description": "Edytuj wygląd strony głównej, aby dostosować ją do Twoich potrzeb.", + "dashboard.widget.changelog.title": "Historia zmian", + "dashboard.widget.reminder.title": "Lista zadań", + "dashboard.widget.reminder.daily": "Dzienne", + "dashboard.widget.reminder.daily.teapot_currency": "Waluta Teapot i exp friendshipa", + "dashboard.widget.reminder.daily.commissions": "Daily", + "dashboard.widget.reminder.daily.resin": "Zużyj resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Co 2 dni", + "dashboard.widget.reminder.two_day.local_specialties": "Lokalne specjalności", + "dashboard.widget.reminder.two_day.ores": "Rudy", + "dashboard.widget.reminder.three_day.title": "Co 3 dni", + "dashboard.widget.reminder.three_day.crystals": "Crystale", + "dashboard.widget.reminder.three_day.teapot_farm": "Farmy w Teapocie", + "dashboard.widget.reminder.three_day.fishing": "Łowienie", + "dashboard.widget.reminder.weekly.title": "Co tydzień", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Pułapka na crystalfly'e", + "dashboard.widget.reminder.weekly.bosses": "Tygodniowe bosy", + "dashboard.widget.reminder.weekly.reputation": "Zlecenia reputacji", + "dashboard.widget.events.title": "Aktualne eventy", + "dashboard.widget.events.version": "Dla wersji", + "dashboard.widget.events.timeline.button": "Wyświetl oś czasu", + "dashboard.widget.todo.title": "Check lista", + "dashboard.widget.domain.title": "Rotacje domen", + "dashboard.widget.achievements.title": "Osiągnięcia", + "dashboard.widget.achievements.progress": "Całkowity postęp", + "dashboard.widget.achievements.latest": "Ostatnie osiągnięcia", + "dashboard.widget.achievements.more": "Zobacz więcej osiągnięć", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Statystyki wishy", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Wszystkie wishe", + "dashboard.widget.wishing.latest": "Ostatnie wishe", + "dashboard.widget.display.title": "Podgląd", + "dashboard.widget.global_wishing.title": "Globalne statystyki wishy", + "dashboard.widget.global_wishing.percentage": "ze wszystkich", + "dashboard.widget.global_wishing.pity_average": "Średnie pity", + "dashboard.widget.global_wishing.based_on": "bazując na {{number}} zgłoszeń", + "dashboard.widget.resin.title": "Trakcer resina", + "dashboard.widget.resin.hour": "g", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Historia banerów broni", "wish.detailed.title.Standard": "Historia baneru standardowego", "wish.detailed.title.CharacterEvent": "Historia banerów postaci", "wish.detailed.title.Beginner": "Historia baneru początkowego", "wish.detailed.title.Chronicled": "Historia Chronicled baneru", - "wish.detailed.info.total_pull_count": "Wszystkich życzeń", - "wish.detailed.info.total_pull_percentage": "% wszystkich życzeń", + "wish.detailed.info.total_pull_count": "Wszystkich wishy", + "wish.detailed.info.total_pull_percentage": "% wszystkich wishy", "wish.detailed.info.pity": "Pity", - "wish.overview.title": "Statystyki życzeń", - "wish.overview.import_wish_button": "Importuj życzenia", + "wish.overview.title": "Statystyki wishy", + "wish.overview.import_wish_button": "Importuj wishe", "wish.overview.global_statistic_button": "Globalne statystyki", - "wish.overview.info.total_pull_count": "Wszystkich życzeń", - "wish.overview.info.total_pull_percentage": "% wszystkich życzeń", + "wish.overview.info.total_pull_count": "Wszystkich wishy", + "wish.overview.info.total_pull_percentage": "% wszystkich wishy", "wish.overview.info.pity": "Pity", "wish.overview.card.title.WeaponEvent": "Broń", "wish.overview.card.title.Standard": "Standardowy", "wish.overview.card.title.CharacterEvent": "Postać", "wish.overview.card.title.Beginner": "Początkowy", "wish.overview.card.title.Chronicled": "Kronikowy", - "wish.overview.card.latest_pulls.title": "Ostatnie 5* życzenie", + "wish.overview.card.latest_pulls.title": "Ostatnie 5* wishe", "wish.overview.card.latest_pulls.no_pulls.title": "Wróć później", - "wish.overview.card.latest_pulls.no_pulls.description": "Jeszcze nie wylosowałeś 5* na tym banerze", - "wish.import.title": "Importuj życzenia", + "wish.overview.card.latest_pulls.no_pulls.description": "Jeszcze nie dostałeś 5* na tym banerze", + "wish.import.title": "Importuj wishe", "wish.import.instructions.step1": "Przejdź do folderu \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", "wish.import.instructions.step2": "Usuń plik \"data_2\", otwórz grę i wyświetl historię wishy", "wish.import.instructions.step3": "Otwórz plik \"data_2\"", "wish.import.instructions.step4": "Szukaj ostatniego wpisu \"e20190909gacha-v3\" (bez cytatów)", "wish.import.instructions.step5": "Skopiuj link i wklej go do pola tekstowego", + "wish.import.instructions.step6": "Kliknij prawym przyciskiem myszy \"data_2 file\" -> kliknij Otwórz, a następnie wybierz Notatnik.", + "wish.import.instructions.step7": "Naciśnij CTRL + F i wybierz przycisk Opuszczania. Następnie wprowadź e20190909gacha-v3 w polu tekstowym i wybierz kierunek \"Góra\".", + "wish.import.instructions.step8": "Skopiuj cały link z \"https://public-operation\" do \"game_biz=hk4e_global\", więc link wygląda w następujący sposób: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Wklej link do pola tekstowego poniżej.", "wish.import.state.error.title": "Coś poszło nie tak. Proszę spróbować później.", "wish.import.state.queued.title": "Twoja prośba oczekuje na przetworzenie", "wish.import.state.queued.description": "Obecnie {{count}} żądań czeka w kolejce", "wish.import.state.active.title": "Twoja prośba jest w trakcie przetwarzania", - "wish.import.state.completed.title": "Twoja prośba została zakończona i twoje życzenia zostały zaimportowane", + "wish.import.state.completed.title": "Twoja prośba została zakończona i twoje wishe zostały zaimportowane", "wish.import.state.completed.description": "Będziesz mógł importować życzenia ponownie od {{date}}", "characters.overview.title": "Postacie", "characters.detailed.tab.stats.title": "Statystyki", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Główne statystyki", "characters.detailed.category.builds.artifacts.sub_stats.title": "Substatystyki", "characters.detailed.category.builds.talents.title": "Talenty", + "welcome.title": "Witaj, Podróżniku!", + "profile.complete.title": "Uzupełnij swój profil, aby odblokować wszystkie funkcje", + "profile.complete.description": "Uzupełniając swój profil, uzyskasz dostęp do ulepszonych funkcji i spersonalizowanych doświadczeń. Po zalogowaniu będziesz mógł importować dane z różnych źródeł i bezpiecznie eksportować informacje.", + "profile.create.success": "Profil został pomyślnie utworzony!", + "profile.create.error": "Błąd podczas tworzenia profilu: {error}", + "profile.create.pending.title": "Tworzenie profilu", + "profile.create.pending.description": "Czekaj, skonfigurujemy Twoje spersonalizowane doświadczenia...", + "profile.create.error.title": "Błąd tworzenia profilu", "settings.overview.title": "Ustawienia", "settings.category.theming.title": "Motywy", "settings.category.data.title": "Dane", "settings.category.data.import_data_button": "Importuj dane", "settings.category.data.export_data_button": "Eksportuj dane", + "settings.login_providers": "Sposoby logowania", + "settings.auto_refine_settings": "Ustawienia Auto Ulepszenia", + "settings.auto_refine_3_star": "Automatyczne udoskonalanie broni 3-gwiazdkowej", + "settings.auto_refine_4_star": "Automatyczne udoskonalanie broni 4-gwiazdkowej", + "settings.auto_refine_5_star": "Automatyczne udoskonalanie broni 5-gwiazdkowej", + "settings.save_settings": "Zapisz ustawienia", + "settings.delete_account": "Usuń konto", + "settings.delete_account_confirmation": "Czy na pewno chcesz usunąć swoje konto? Ta akcja jest nieodwracalna i wszystkie dane zostaną utracone.", + "settings.delete_account_confirm": "Usuń konto", + "settings.import.pending": "Trwa import danych, proszę czekać...", + "settings.import.success.title": "Pomyślnie importowano!", + "settings.import.success.description": "Twoje dane zostały wysłane na serwer i zostaną wkrótce przetworzone. Zostaniesz przekierowany na stronę ustawień.", "settings.import.title": "Importuj dane konta", "settings.import.no_file_selected": "Nie wybrano pliku", "settings.import.warning.title": "Uwaga!", "settings.import.warning.description": "Spowoduje to nadpisanie istniejących danych", "settings.import.start_import_button": "Rozpocznij importowanie", "settings.import.confirmation_dialog.title": "Czy jesteś pewny?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin spróbuje scalić importowane dane z bieżącymi danymi. Jeśli widzisz jakiś błąd, zgłoś je na kanale Discord", + "settings.category.danger_zone.title": "Niebezpieczna strefa", "login.title": "Możesz zrobić więcej z kontem!", + "login.alert.title": "Ważne: lokalna informacja o danych", + "login.alert.description": "Logowanie nadpisze Twoje dane lokalne. Upewnij się, że zrobiłeś kopię zapasową wszystkich ważnych informacji, zanim przejdziesz dalej.", "login.perk.cross_device_sync.title": "Synchronizacja między urządzeniami", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Dostęp do funkcji po stronie serwera", @@ -83,11 +157,11 @@ "login.perk.personal_profile.title": "Udostępnij swój profil", "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "map.title": "Mapa", - "todo.title": "Do zrobienia", + "todo.title": "Check lista", "inventory.title": "Ekwipunek", "weapons.title": "Bronie", - "chart.rarity_distribution.title": "Rozkład rzadkości", - "chart.wish_distribution_time.title": "Rozmieszczenie życzeń na przestrzeni czasu", + "chart.rarity_distribution.title": "Dystrybucja rzadkości", + "chart.wish_distribution_time.title": "Rozmieszczenie wishy na przestrzeni czasu", "table.banner_history.date": "Data", "table.banner_history.type": "Rodzaj", "table.banner_history.name": "Nazwa", @@ -95,9 +169,33 @@ "table.banner_history.pity": "Pity", "theme.dark.title": "Ciemny", "theme.light.title": "Jasny", - "server.wish_history.active": "Twoja historia życzeń jest teraz przetwarzana", - "server.wish_history.success": "Twoja historia życzeń została pomyślnie zaimportowana", - "server.wish_history.error": "Nie udało się zaimportować historii życzeń", + "server.wish_history.active": "Twoja historia wishy jest teraz przetwarzana", + "server.wish_history.success": "Twoja historia wishy została pomyślnie zaimportowana", + "server.wish_history.error": "Nie udało się zaimportować historii wishy", + "action.reset_filters": "Zresetuj filtry", + "filter.element": "Element", + "filter.weapon": "Broń", + "sort.rarity": "Rarity", + "sort.name": "Imię", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Data", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Konstelacja", + "achievement.title": "Osiągnięcia", + "achievement.filter.all": "Brak filtra", + "achievement.filter.version": "Wersja", + "achievement.filter.type": "Rodzaj", + "achievement.filter.hidden": "Ukryte", + "achievement.more_info": "Więcej informacji", + "achievement.unachieved": "Pokaż najpierw nieosiągnięte", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/PT.json b/src/lib/locales/PT.json index eb9881d4..64501bee 100644 --- a/src/lib/locales/PT.json +++ b/src/lib/locales/PT.json @@ -8,16 +8,63 @@ "action.yes": "Sim", "action.no": "Não", "action.confirm": "Confirmar", - "action.sort_by": "Organizar por", + "action.cancel": "Cancelar", + "action.sort_by": "Organizar por {{sortFN}}", "action.filter_by": "Filtrar por", "navigation.category.collection": "Sua coleção", "navigation.category.trackers": "Progresso", "navigation.category.tools": "Ferramentas", - "navigation.languageswitcher.title": "Escolha seu idioma", - "navigation.login": "Entrar ou registrar", + "navigation.languageswitcher.title": "Escolha o seu idioma", + "navigation.login": "Entrar ou registrar-se", "navigation.logout": "Sair", "error.title": "Erro", "dashboard.title": "Painel principal", + "dashboard.welcome.title": "Bem-Vindo ao Dval.in!", + "dashboard.welcome.message": "O seu melhor companheiro no Genshin Impact! Dval.in ajuda a planejar o que farmar com a Calculadora de Ascensão e acompanhar o seu progresso com a Lista de Afazeres e Histórico de Orações.", + "dashboard.edit_layout.button": "Editar", + "dashboard.edit_layout.title": "Editar o layout", + "dashboard.edit_layout.description": "Edite o layout da página inicial para atender as suas necessidades.", + "dashboard.widget.changelog.title": "Alterações", + "dashboard.widget.reminder.title": "Lembretes", + "dashboard.widget.reminder.daily": "Diário", + "dashboard.widget.reminder.daily.teapot_currency": "Moedas e Pontos de Amizade no Bule", + "dashboard.widget.reminder.daily.commissions": "Comissões diárias", + "dashboard.widget.reminder.daily.resin": "Gastar resina", + "dashboard.widget.reminder.daily.welkin": "Benção da Lua Nova", + "dashboard.widget.reminder.two_day.title": "A cada 2 dias", + "dashboard.widget.reminder.two_day.local_specialties": "Especialidades locais", + "dashboard.widget.reminder.two_day.ores": "Minérios", + "dashboard.widget.reminder.three_day.title": "A cada 3 dias", + "dashboard.widget.reminder.three_day.crystals": "Pedaços de Cristal", + "dashboard.widget.reminder.three_day.teapot_farm": "Colheita do Bule", + "dashboard.widget.reminder.three_day.fishing": "Pesca", + "dashboard.widget.reminder.weekly.title": "Semanal", + "dashboard.widget.reminder.weekly.parametric_transformer": "Transformador Paramétrico", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Caça de Borboletas de Cristal", + "dashboard.widget.reminder.weekly.bosses": "Chefes Semanais", + "dashboard.widget.reminder.weekly.reputation": "Reputação", + "dashboard.widget.events.title": "Eventos Atuais", + "dashboard.widget.events.version": "Para a versão", + "dashboard.widget.events.timeline.button": "Ver linha do tempo", + "dashboard.widget.todo.title": "Lista de afazeres", + "dashboard.widget.domain.title": "Rotação de domínios", + "dashboard.widget.achievements.title": "Conquistas", + "dashboard.widget.achievements.progress": "Progresso Total", + "dashboard.widget.achievements.latest": "Conquistas recentes", + "dashboard.widget.achievements.more": "Ver mais conquistas", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Estatísticas de oração", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Orações Totais", + "dashboard.widget.wishing.latest": "Orações mais recentes", + "dashboard.widget.display.title": "Exibição", + "dashboard.widget.global_wishing.title": "Estatísticas globais de oração", + "dashboard.widget.global_wishing.percentage": "de todos", + "dashboard.widget.global_wishing.pity_average": "Pity médio", + "dashboard.widget.global_wishing.based_on": "baseado em {{number}} submissões", + "dashboard.widget.resin.title": "Acompanhar resina", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Histórico do evento de armas", "wish.detailed.title.Standard": "Histórico da invocação do mochileiro", "wish.detailed.title.CharacterEvent": "Histórico do evento de personagens", @@ -38,7 +85,7 @@ "wish.overview.card.title.Beginner": "Oração de novatos", "wish.overview.card.title.Chronicled": "Registro de oração", "wish.overview.card.latest_pulls.title": "Oração 5* mais recente", - "wish.overview.card.latest_pulls.no_pulls.title": "Volte mais tarde!", + "wish.overview.card.latest_pulls.no_pulls.title": "Volte mais tarde", "wish.overview.card.latest_pulls.no_pulls.description": "Você não adquiriu um 5* neste evento ainda", "wish.import.title": "Importar orações", "wish.import.instructions.step1": "Navegue até a pasta \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", @@ -46,11 +93,15 @@ "wish.import.instructions.step3": "Abra o arquivo \"data_2\"", "wish.import.instructions.step4": "Procure pela última entrada em \"e20190909gacha-v3\" (sem aspas)", "wish.import.instructions.step5": "Copie o link e cole-o no campo de texto", + "wish.import.instructions.step6": "Clique com o botão direito em \"data_2 file\" -> clique em Abrir e selecione o Bloco de Notas.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Algo deu errado. Por favor, tente novamente mais tarde.", "wish.import.state.queued.title": "Sua solicitação está sendo processada", "wish.import.state.queued.description": "Atualmente, {{count}} pedidos estão esperando na fila", "wish.import.state.active.title": "Sua solicitação está sendo processada", - "wish.import.state.completed.title": "Sua solicitação foi completada e os históricos de orações foram importados", + "wish.import.state.completed.title": "A sua solicitação foi completa e os históricos de orações foram importados", "wish.import.state.completed.description": "Você será capaz de importar novas orações em {{date}}", "characters.overview.title": "Personagens", "characters.detailed.tab.stats.title": "Atributos", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Atributos principais", "characters.detailed.category.builds.artifacts.sub_stats.title": "Atributos secundários", "characters.detailed.category.builds.talents.title": "Talentos", + "welcome.title": "Bem-vindo, Viajante!", + "profile.complete.title": "Complete o seu perfil para ter acesso a todas as funções", + "profile.complete.description": "Completando o seu perfil, você ganha acesso a mais recursos e uma experiência personalizada. Ao se conectar, será possível importar dados de diversas fontes e exportar as suas informações de forma segura.", + "profile.create.success": "Perfil criado com sucesso!", + "profile.create.error": "Erro ao criar perfil: {error}", + "profile.create.pending.title": "Criando o seu perfil", + "profile.create.pending.description": "Aguarde enquanto construimos a sua experiência personalizada...", + "profile.create.error.title": "Erro ao criar perfil", "settings.overview.title": "Configurações", "settings.category.theming.title": "Temas", "settings.category.data.title": "Dados", "settings.category.data.import_data_button": "Importar dados", "settings.category.data.export_data_button": "Exportar dados", + "settings.login_providers": "Provedores de acesso", + "settings.auto_refine_settings": "Configurações de Auto Refinamento", + "settings.auto_refine_3_star": "Refinar automaticamente armas de 3 estrelas", + "settings.auto_refine_4_star": "Refinar automaticamente armas de 4 estrelas", + "settings.auto_refine_5_star": "Refinar automaticamente armas de 5 estrelas", + "settings.save_settings": "Salvar Configurações", + "settings.delete_account": "Deletar conta", + "settings.delete_account_confirmation": "Tem certeza que deseja deletar a sua conta? Essa ação é irreversível e todos os seus dados serão perdidos.", + "settings.delete_account_confirm": "Deletar conta", + "settings.import.pending": "Importando dados, aguarde...", + "settings.import.success.title": "Importado com sucesso!", + "settings.import.success.description": "Os seus dados foram enviados para o servidor e serão processados logo, você será redirecionado a página de configurações.", "settings.import.title": "Importar dados da conta", "settings.import.no_file_selected": "Nenhum arquivo foi selecionado", "settings.import.warning.title": "Atenção!", "settings.import.warning.description": "Isso irá substituir os dados existentes", "settings.import.start_import_button": "Iniciar importação", "settings.import.confirmation_dialog.title": "Você tem certeza?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin irá tentar mesclar os seus dados importados com os dados atuas. Se notar algum erro, favor reportar no Discord", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Faça mais com uma conta!", + "login.alert.title": "Importante: Aviso de Dados Locais", + "login.alert.description": "Conectar-se irá sobrescrever os seus dados locais. Tenha certeza de que fez o backup de dados importantes antes de continuar.", "login.perk.cross_device_sync.title": "Sincronização entre dispositivos", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Acesso às funções internas do servidor", @@ -98,6 +172,30 @@ "server.wish_history.active": "Seu histórico de orações está sendo processado", "server.wish_history.success": "Seu histórico de orações foi importado com successo", "server.wish_history.error": "A importação do seu histórico de orações falhou", + "action.reset_filters": "Redefinir Filtros", + "filter.element": "Elemento", + "filter.weapon": "Arma", + "sort.rarity": "Rarity", + "sort.name": "Nome", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Data", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constelação", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Raridade", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/RU.json b/src/lib/locales/RU.json index 34ed7166..e26d9089 100644 --- a/src/lib/locales/RU.json +++ b/src/lib/locales/RU.json @@ -8,6 +8,7 @@ "action.yes": "Да", "action.no": "Нет", "action.confirm": "Подтвердить", + "action.cancel": "Cancel", "action.sort_by": "Сортировать", "action.filter_by": "Фильтр", "navigation.category.collection": "Коллекция", @@ -18,6 +19,52 @@ "navigation.logout": "Выйти из аккаунта", "error.title": "Ошибка", "dashboard.title": "Информационная панель", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Edit", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Молитва события оружия", "wish.detailed.title.Standard": "Стандартная молитва", "wish.detailed.title.CharacterEvent": "Молитва события персонажа", @@ -46,6 +93,10 @@ "wish.import.instructions.step3": "С помощью блокнота откройте заново созданный файл \"data_2\"", "wish.import.instructions.step4": "Запустите поиск по тексту и введите \"e20190909gacha-v3\" (без кавычек), после чего выберите самую последнюю найденную запись", "wish.import.instructions.step5": "Скопируйте целиком ссылку, включающую указанную запись, затем вставьте ее в текстовое поле ниже", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Что-то пошло не так, попробуйте позже.", "wish.import.state.queued.title": "Ваш запрос ожидает обработки.", "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Основные характеристики", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Таланты", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", "settings.overview.title": "Настройки", "settings.category.theming.title": "Темы", "settings.category.data.title": "Данные", "settings.category.data.import_data_button": "Import data", "settings.category.data.export_data_button": "Export data", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", "settings.import.title": "Импортировать данные", "settings.import.no_file_selected": "Файл не выбран", "settings.import.warning.title": "Внимание!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "Merging data can provoke unexpected errors", "settings.import.start_import_button": "Начать импорт", "settings.import.confirmation_dialog.title": "Вы уверены?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin will try to merge your imported data with the current data. If you see any error please report it on the discord channel", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Больше возможностей с аккаунтом!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", "login.perk.cross_device_sync.title": "Кроссплатформенная синхронизация", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Доступ к функциям сервера", @@ -98,6 +172,30 @@ "server.wish_history.active": "Ваша история молитв обрабатывается", "server.wish_history.success": "Ваша история молитв успешно загружена", "server.wish_history.error": "Загрузка вашей истории молитв не удалась", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/TH.json b/src/lib/locales/TH.json index 6e1a0985..474ed666 100644 --- a/src/lib/locales/TH.json +++ b/src/lib/locales/TH.json @@ -8,6 +8,7 @@ "action.yes": "Yes", "action.no": "No", "action.confirm": "Confirm", + "action.cancel": "Cancel", "action.sort_by": "Sort By", "action.filter_by": "Filter By", "navigation.category.collection": "คอลเลคชั่นของคุณ", @@ -18,6 +19,52 @@ "navigation.logout": "ออกจากระบบ", "error.title": "Error", "dashboard.title": "แผงควบคุม", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Edit", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "Weapon banner history", "wish.detailed.title.Standard": "Standard banner history", "wish.detailed.title.CharacterEvent": "Character banner history", @@ -41,11 +88,15 @@ "wish.overview.card.latest_pulls.no_pulls.title": "Come back later", "wish.overview.card.latest_pulls.no_pulls.description": "You haven't pulled a 5* on this banner yet", "wish.import.title": "Import wishes", - "wish.import.instructions.step1": "Navigate to folder \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%latest\n\t\t\t\tversion%\\Cache\\Cache_Data\"", - "wish.import.instructions.step2": "Delete file \"data_2\", open the game and view your wish history", - "wish.import.instructions.step3": "Open file \"data_2\"", - "wish.import.instructions.step4": "Search for the last entry of \"e20190909gacha-v3\" (without quotes)", - "wish.import.instructions.step5": "Copy the link and paste it into the text field", + "wish.import.instructions.step1": "Open Genshin Impact on PC (if you use multiple accounts, please restart the game).", + "wish.import.instructions.step2": "Open wish history page and wait for it to load completely.", + "wish.import.instructions.step3": "Close the game.", + "wish.import.instructions.step4": "Open the folder where the game is installed (Example: default is \"C:\\Program Files\\Genshin Impact\"). You can find the location of this folder by opening the launcher -> Settings -> Game Resources -> Installation Location", + "wish.import.instructions.step5": "Open folder \"Genshin Impact game\" -> \"GenshinImpact_Data\" -> \"webCaches\" -> \"2.24.0.0\" -> \"Cache\" -> \"CacheData\"", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "Something went wrong. Please try again later.", "wish.import.state.queued.title": "Your request is waiting to be processed", "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", @@ -63,19 +114,42 @@ "characters.detailed.category.builds.artifacts.main_stats.title": "Main Stats", "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", "characters.detailed.category.builds.talents.title": "Talents", + "welcome.title": "Welcome, Traveler!", + "profile.complete.title": "Complete Your Profile to Unlock Full Features", + "profile.complete.description": "By completing your profile, you'll gain access to enhanced features and personalized experiences. Once logged in, you'll be able to import data from various sources and export your information securely.", + "profile.create.success": "Profile created successfully!", + "profile.create.error": "Error creating profile: {error}", + "profile.create.pending.title": "Creating Your Profile", + "profile.create.pending.description": "Please wait while we set up your personalized experience...", + "profile.create.error.title": "Profile Creation Error", "settings.overview.title": "การตั้งค่า", "settings.category.theming.title": "Theming", "settings.category.data.title": "Data", "settings.category.data.import_data_button": "Import data", "settings.category.data.export_data_button": "Export data", + "settings.login_providers": "Login providers", + "settings.auto_refine_settings": "Auto Refine Settings", + "settings.auto_refine_3_star": "Auto Refine 3-star weapons", + "settings.auto_refine_4_star": "Auto Refine 4-star weapons", + "settings.auto_refine_5_star": "Auto Refine 5-star weapons", + "settings.save_settings": "Save Settings", + "settings.delete_account": "Delete account", + "settings.delete_account_confirmation": "Are you sure you want to delete your account? This action is irreversible and all data will be lost.", + "settings.delete_account_confirm": "Delete account", + "settings.import.pending": "Importing data, please wait...", + "settings.import.success.title": "Imported successfully!", + "settings.import.success.description": "Your data has been send to the server and will be processed soon. You will be redirected to the settings page.", "settings.import.title": "Import account data", "settings.import.no_file_selected": "No file selected", "settings.import.warning.title": "Watch out!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "Merging data can provoke unexpected errors", "settings.import.start_import_button": "Start import", "settings.import.confirmation_dialog.title": "Are you sure?", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin will try to merge your imported data with the current data. If you see any error please report it on the discord channel", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "Be able to do more with an account!", + "login.alert.title": "Important: Local Data Notice", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", "login.perk.cross_device_sync.title": "Cross-device synchronization", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "Access to server side functions", @@ -98,6 +172,30 @@ "server.wish_history.active": "Your wish history is now being processed", "server.wish_history.success": "Your wish history was successfully imported", "server.wish_history.error": "Your wish history failed to import", + "action.reset_filters": "Reset Filters", + "filter.element": "Element", + "filter.weapon": "Weapon", + "sort.rarity": "Rarity", + "sort.name": "Name", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Date", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Constellation", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/locales/VI.json b/src/lib/locales/VI.json new file mode 100644 index 00000000..f78ed283 --- /dev/null +++ b/src/lib/locales/VI.json @@ -0,0 +1,212 @@ +{ + "translation": { + "action.more": "Xem thêm", + "action.hide": "Ẩn", + "action.previous": "Trước", + "action.next": "Tiếp", + "action.select_file": "Chọn tập tin", + "action.yes": "Có", + "action.no": "Không", + "action.confirm": "Xác nhận", + "action.cancel": "Hủy", + "action.sort_by": "Xếp theo: {{sortFN}}", + "action.filter_by": "Bộ lọc", + "navigation.category.collection": "Bộ sưu tập", + "navigation.category.trackers": "Tracker", + "navigation.category.tools": "Công cụ", + "navigation.languageswitcher.title": "Chọn ngôn ngữ", + "navigation.login": "Đăng nhập hoặc đăng ký", + "navigation.logout": "Đăng xuất", + "error.title": "Lỗi", + "dashboard.title": "Tổng quan", + "dashboard.welcome.title": "Chào mừng đến với Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Sửa", + "dashboard.edit_layout.title": "Sửa bố cục", + "dashboard.edit_layout.description": "Chỉnh sửa bố cục trang chính để phù hợp với nhu cầu của bạn.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Nhắc nhở", + "dashboard.widget.reminder.daily": "Mỗi ngày", + "dashboard.widget.reminder.daily.teapot_currency": "Tiền Động Tiên và độ yêu thích", + "dashboard.widget.reminder.daily.commissions": "Ủy thác mỗi ngày", + "dashboard.widget.reminder.daily.resin": "Xả nhựa", + "dashboard.widget.reminder.daily.welkin": "Thẻ tháng", + "dashboard.widget.reminder.two_day.title": "Mỗi 2 ngày", + "dashboard.widget.reminder.two_day.local_specialties": "Đặc sản khu vực", + "dashboard.widget.reminder.two_day.ores": "Quặng", + "dashboard.widget.reminder.three_day.title": "Mỗi 3 ngày", + "dashboard.widget.reminder.three_day.crystals": "Quặng rèn", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Câu cá", + "dashboard.widget.reminder.weekly.title": "Mỗi tuần", + "dashboard.widget.reminder.weekly.parametric_transformer": "Máy Biến Đổi Tham Số", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Boss tuần", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Sự Kiện Hiện Tại", + "dashboard.widget.events.version": "Phiên Bản", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Xoay Tua Bí Cảnh", + "dashboard.widget.achievements.title": "Thành Tựu", + "dashboard.widget.achievements.progress": "Tổng tiến trình", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "Xem thêm thành tựu", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", + "wish.detailed.title.WeaponEvent": "Lịch sử cầu nguyện vũ khí", + "wish.detailed.title.Standard": "Lịch sử cầu nguyện thường", + "wish.detailed.title.CharacterEvent": "Lịch sử cầu nguyện nhân vật", + "wish.detailed.title.Beginner": "Lịch sử cầu nguyện tân thủ", + "wish.detailed.title.Chronicled": "Lịch sử Sử ký cầu nguyện", + "wish.detailed.info.total_pull_count": "Tổng số lần quay", + "wish.detailed.info.total_pull_percentage": "% of total pulls", + "wish.detailed.info.pity": "Pity", + "wish.overview.title": "Thống kê cầu nguyện", + "wish.overview.import_wish_button": "Nhập lịch sử cầu nguyện", + "wish.overview.global_statistic_button": "Số liệu toàn cục", + "wish.overview.info.total_pull_count": "Tổng số lần quay", + "wish.overview.info.total_pull_percentage": "% of total pulls", + "wish.overview.info.pity": "Pity", + "wish.overview.card.title.WeaponEvent": "Vũ Khí", + "wish.overview.card.title.Standard": "Cầu Nguyện Thường", + "wish.overview.card.title.CharacterEvent": "Nhân Vật", + "wish.overview.card.title.Beginner": "Tân Thủ", + "wish.overview.card.title.Chronicled": "Sử Ký", + "wish.overview.card.latest_pulls.title": "5* nhận gần nhất", + "wish.overview.card.latest_pulls.no_pulls.title": "Hãy quay lại sau", + "wish.overview.card.latest_pulls.no_pulls.description": "Bạn chưa nhận được 5* trên banner này", + "wish.import.title": "Nhập lịch sử cầu nguyện", + "wish.import.instructions.step1": "Mở thư mục \"C:\\Games\\Genshin Impact\\GenshinImpact_Data\\webCaches\\%phiên bản mới nhất%\\Cache\\Cache_Data\"", + "wish.import.instructions.step2": "Xóa tập tin \"data_2\", sau đó mở trò chơi và vào giao diện lịch sử cầu nguyện", + "wish.import.instructions.step3": "Mở tập tin \"data_2\"", + "wish.import.instructions.step4": "Tìm văn bản \"e20190909gacha-v3\" (không tính ngoặc kép) xuất hiện ở dưới cùng", + "wish.import.instructions.step5": "Sao chép liên kết và dán vào ô văn bản dưới đây", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", + "wish.import.state.error.title": "Đã xảy ra lỗi. Vui lòng thử lại sau.", + "wish.import.state.queued.title": "Yêu cầu của bạn đang chờ được xử lý", + "wish.import.state.queued.description": "Hiện đang có {{count}} yêu cầu trong hàng chờ", + "wish.import.state.active.title": "Yêu cầu của bạn đang được xử lý", + "wish.import.state.completed.title": "Yêu cầu của bạn đã được hoàn thành và lịch sử cầu nguyện đã được nhập", + "wish.import.state.completed.description": "Bạn có thể tiếp tục nhập lịch sử cầu nguyện vào {{date}}", + "characters.overview.title": "Nhân vật", + "characters.detailed.tab.stats.title": "Thuộc Tính", + "characters.detailed.tab.talents.title": "Thiên Phú", + "characters.detailed.tab.constellations.title": "Cung Mệnh", + "characters.detailed.category.builds.title": "Build", + "characters.detailed.category.builds.view_on_kqm_button": "Xem trên KQM", + "characters.detailed.category.builds.weapons.title": "Vũ Khí", + "characters.detailed.category.builds.artifacts.title": "Thánh Di Vật", + "characters.detailed.category.builds.artifacts.main_stats.title": "Dòng Chính", + "characters.detailed.category.builds.artifacts.sub_stats.title": "Dòng Phụ", + "characters.detailed.category.builds.talents.title": "Thiên Phú", + "welcome.title": "Xin chào mừng, hỡi Nhà Lữ Hành!", + "profile.complete.title": "Hoàn thiện hồ sơ của bạn để mở khóa đầy đủ tính năng", + "profile.complete.description": "Khi hoàn thiện hồ sơ, bạn sẽ có thể sử dụng các tính năng nâng cao và có trải nghiệm được cá nhân hóa. Sau khi đăng nhập, bạn sẽ có thể nhập dữ liệu từ nhiều nguồn khác nhau và xuất dữ liệu của bạn một cách bảo mật.", + "profile.create.success": "Tạo hồ sơ thành công!", + "profile.create.error": "Lỗi khi tạo hồ sơ: {error}", + "profile.create.pending.title": "Đang tạo hồ sơ cho bạn", + "profile.create.pending.description": "Vui lòng chờ trong khi chúng tôi thiết lập trải nghiệm cá nhân hóa cho bạn...", + "profile.create.error.title": "Lỗi Khi Tạo Hồ Sơ", + "settings.overview.title": "Cài đặt", + "settings.category.theming.title": "Chủ đề", + "settings.category.data.title": "Dữ liệu", + "settings.category.data.import_data_button": "Nhập dữ liệu", + "settings.category.data.export_data_button": "Xuất dữ liệu", + "settings.login_providers": "Phương thức đăng nhập", + "settings.auto_refine_settings": "Tùy chỉnh Tự Động Tinh Luyện", + "settings.auto_refine_3_star": "Tự Tinh Luyện vũ khí 3 sao", + "settings.auto_refine_4_star": "Tự Tinh Luyện vũ khí 4 sao", + "settings.auto_refine_5_star": "Tự Tinh Luyện vũ khí 5 sao", + "settings.save_settings": "Lưu Thiết Lập", + "settings.delete_account": "Xóa tài khoản", + "settings.delete_account_confirmation": "Bạn có chắc muốn xóa tài khoản không? Hành động này không thể được hoàn tác và tất cả dữ liệu sẽ bị xóa.", + "settings.delete_account_confirm": "Xóa tài khoản", + "settings.import.pending": "Đang nhập dữ liệu, vui lòng đợi...", + "settings.import.success.title": "Nhập dữ liệu thành công!", + "settings.import.success.description": "Dữ liệu của bạn đã được gửi lên máy chủ và sẽ sớm được xử lý. Bạn sẽ được chuyển hướng về trang cài đặt.", + "settings.import.title": "Nhập dữ liệu tài khoản", + "settings.import.no_file_selected": "Chưa chọn tập tin nào", + "settings.import.warning.title": "Lưu ý!", + "settings.import.warning.description": "Hành động này sẽ ghi đè dữ liệu đang tồn tại", + "settings.import.start_import_button": "Bắt đầu nhập", + "settings.import.confirmation_dialog.title": "Bạn có chắc không?", + "settings.import.confirmation_dialog.description": "Dvalin sẽ hợp nhất dữ liệu đã nhập với dữ liệu có sẵn của bạn. Nếu bạn phát hiện bất kỳ lỗi gì, hãy báo cáo lại trong kênh Discord", + "settings.category.danger_zone.title": "Dangerzone", + "login.title": "Be able to do more with an account!", + "login.alert.title": "Quan trọng: Nhắc nhở về dữ liệu cục bộ", + "login.alert.description": "Logging in will overwrite your local data. Please ensure you've backed up any important information before proceeding.", + "login.perk.cross_device_sync.title": "Đồng bộ trên nhiều thiết bị", + "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.server_access.title": "Access to server side functions", + "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.personal_profile.title": "Chia sẻ hồ sơ cá nhân của bạn", + "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "map.title": "Bản đồ", + "todo.title": "Công việc", + "inventory.title": "Túi", + "weapons.title": "Vũ khí", + "chart.rarity_distribution.title": "Phân bổ theo độ hiếm", + "chart.wish_distribution_time.title": "Biểu đồ cầu nguyện theo thời gian", + "table.banner_history.date": "Thời gian", + "table.banner_history.type": "Loại", + "table.banner_history.name": "Tên", + "table.banner_history.rarity": "Độ hiếm", + "table.banner_history.pity": "Pity", + "theme.dark.title": "Tối", + "theme.light.title": "Sáng", + "server.wish_history.active": "Lịch sử cầu nguyện của bạn đang được xử lý", + "server.wish_history.success": "Đã nhập thành công lịch sử cầu nguyện của bạn", + "server.wish_history.error": "Nhập lịch sử cầu nguyện thất bại", + "action.reset_filters": "Đặt lại bộ lọc", + "filter.element": "Nguyên Tố", + "filter.weapon": "Vũ Khí", + "sort.rarity": "Rarity", + "sort.name": "Tên", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "Thời gian", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "Cung Mệnh", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", + "language.DE": "Deutsch", + "language.EN": "English", + "language.ES": "Español", + "language.FR": "Français", + "language.IT": "Italiano", + "language.PL": "Polski", + "language.PT": "Português", + "language.RU": "Русский", + "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", + "language.ZHS": "简体中文", + "language.ZHT": "繁體中文" + } +} diff --git a/src/lib/locales/ZH-S.json b/src/lib/locales/ZH-S.json index eec7f4fc..19364103 100644 --- a/src/lib/locales/ZH-S.json +++ b/src/lib/locales/ZH-S.json @@ -8,6 +8,7 @@ "action.yes": "是", "action.no": "否", "action.confirm": "确认", + "action.cancel": "取消", "action.sort_by": "排序方式", "action.filter_by": "过滤方式", "navigation.category.collection": "你的收藏", @@ -18,6 +19,52 @@ "navigation.logout": "登出", "error.title": "错误", "dashboard.title": "主页", + "dashboard.welcome.title": "欢迎使用 Dval.in!", + "dashboard.welcome.message": "你最好的原神伙伴!Dval.in 会帮助你规划材料收集与体力消耗,还会记录你的游戏进度以及祈愿结果。", + "dashboard.edit_layout.button": "编辑", + "dashboard.edit_layout.title": "编辑布局", + "dashboard.edit_layout.description": "编辑您的主页布局以满足您的需求。", + "dashboard.widget.changelog.title": "更新记录", + "dashboard.widget.reminder.title": "提醒器", + "dashboard.widget.reminder.daily": "每日", + "dashboard.widget.reminder.daily.teapot_currency": "尘歌壶货币与好感度", + "dashboard.widget.reminder.daily.commissions": "每日委托", + "dashboard.widget.reminder.daily.resin": "使用树脂", + "dashboard.widget.reminder.daily.welkin": "空月祝福", + "dashboard.widget.reminder.two_day.title": "每两日", + "dashboard.widget.reminder.two_day.local_specialties": "区域特产", + "dashboard.widget.reminder.two_day.ores": "矿物", + "dashboard.widget.reminder.three_day.title": "每三日", + "dashboard.widget.reminder.three_day.crystals": "水晶块", + "dashboard.widget.reminder.three_day.teapot_farm": "尘歌壶田地", + "dashboard.widget.reminder.three_day.fishing": "钓鱼", + "dashboard.widget.reminder.weekly.title": "每周", + "dashboard.widget.reminder.weekly.parametric_transformer": "参量质变仪", + "dashboard.widget.reminder.weekly.crystalfly_trap": "晶蝶诱捕装置", + "dashboard.widget.reminder.weekly.bosses": "每周副本", + "dashboard.widget.reminder.weekly.reputation": "声望悬赏", + "dashboard.widget.events.title": "当前活动", + "dashboard.widget.events.version": "用于版本", + "dashboard.widget.events.timeline.button": "查看时间线", + "dashboard.widget.todo.title": "待办清单", + "dashboard.widget.domain.title": "秘境轮替", + "dashboard.widget.achievements.title": "成就", + "dashboard.widget.achievements.progress": "总进度", + "dashboard.widget.achievements.latest": "最新获得成就", + "dashboard.widget.achievements.more": "查看更多成就", + "dashboard.widget.pity.title": "保底", + "dashboard.widget.wishing.title": "祈愿数据", + "dashboard.widget.wishing.pity": "保底进度", + "dashboard.widget.wishing.total": "祈愿总计", + "dashboard.widget.wishing.latest": "最新祈愿", + "dashboard.widget.display.title": "显示", + "dashboard.widget.global_wishing.title": "全球祈愿数据", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "平均保底数量", + "dashboard.widget.global_wishing.based_on": "基于 {{number}} 份提交", + "dashboard.widget.resin.title": "树脂记录", + "dashboard.widget.resin.hour": "时", + "dashboard.widget.resin.minute": "分", "wish.detailed.title.WeaponEvent": "武器池记录", "wish.detailed.title.Standard": "常驻池记录", "wish.detailed.title.CharacterEvent": "角色池记录", @@ -46,9 +93,13 @@ "wish.import.instructions.step3": "请打开文件 \"data_2\"", "wish.import.instructions.step4": "请找到在 \"e20190909gacha-v3\" 里最后的记录", "wish.import.instructions.step5": "复制并粘贴在文字框", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "某个地方出现错误了,请稍后再试", "wish.import.state.queued.title": "您的申请正在等待处理", - "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", + "wish.import.state.queued.description": "现在有 {{count}} 个申请正在等待处理", "wish.import.state.active.title": "您的申请正在处理中", "wish.import.state.completed.title": " 您的申请已完成并且记录也已导入完毕", "wish.import.state.completed.description": "您将可以在 {{date}} 进行再次导入", @@ -58,30 +109,53 @@ "characters.detailed.tab.constellations.title": "命之座", "characters.detailed.category.builds.title": "角色陪养", "characters.detailed.category.builds.view_on_kqm_button": "见KQM", - "characters.detailed.category.builds.weapons.title": "Weapon", + "characters.detailed.category.builds.weapons.title": "武器", "characters.detailed.category.builds.artifacts.title": "圣遗物", "characters.detailed.category.builds.artifacts.main_stats.title": "主词条", - "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", + "characters.detailed.category.builds.artifacts.sub_stats.title": "副词条", "characters.detailed.category.builds.talents.title": "天赋", + "welcome.title": "欢迎你,旅行者。", + "profile.complete.title": "请创立您的账户以解锁完整功能", + "profile.complete.description": "通过创立账户,您将获得增强功能和个性化体验。 登录后,您将能够从各种来源导入数据并安全地导出您的信息。", + "profile.create.success": "账户创立成功!", + "profile.create.error": "账户创立错误:{错误}", + "profile.create.pending.title": "正在创立个人账户", + "profile.create.pending.description": "请稍等,我们正在设置您的个性化体验...", + "profile.create.error.title": "账户创立错误", "settings.overview.title": "设置", "settings.category.theming.title": "界面主题", "settings.category.data.title": "记录", - "settings.category.data.import_data_button": "Import data", - "settings.category.data.export_data_button": "Export data", + "settings.category.data.import_data_button": "导入数据", + "settings.category.data.export_data_button": "导出数据", + "settings.login_providers": "登录提供商", + "settings.auto_refine_settings": "自动精炼设置", + "settings.auto_refine_3_star": "自动精炼3星武器", + "settings.auto_refine_4_star": "自动精炼4星武器", + "settings.auto_refine_5_star": "自动精炼5星武器", + "settings.save_settings": "保存设置", + "settings.delete_account": "删除账号", + "settings.delete_account_confirmation": "您确定要删除您的帐户?此操作不可逆,所有数据都将丢失。", + "settings.delete_account_confirm": "删除账号", + "settings.import.pending": "正在导入数据,请稍候...", + "settings.import.success.title": "导入成功!", + "settings.import.success.description": "您的数据已发送到服务器。您将被重定向到设置页面。", "settings.import.title": "导入账号记录", "settings.import.no_file_selected": "无选择文件", "settings.import.warning.title": "注意!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "合并数据可能引发意外错误", "settings.import.start_import_button": "开始导入", "settings.import.confirmation_dialog.title": "确认继续吗", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin 将尝试将您的导入的数据与当前数据合并。如果出现任何错误,请在 Discord 频道上报告", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "拥有账号可以做更多!", + "login.alert.title": "重要:本地数据通知", + "login.alert.description": "登录将覆盖您的本地数据。请确保您在继续之前已备份所有重要信息。", "login.perk.cross_device_sync.title": "跨设备同步", - "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.cross_device_sync.description": "跨设备同步说明", "login.perk.server_access.title": "访问服务器端功能", - "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.server_access.description": "服务器访问说明", "login.perk.personal_profile.title": "分享您的账号", - "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "login.perk.personal_profile.description": "个人账户说明", "map.title": "地图", "todo.title": "待办清单", "inventory.title": "背包", @@ -98,16 +172,41 @@ "server.wish_history.active": " 您的祈愿记录正在导入中", "server.wish_history.success": "您的祈愿记录已导入完毕", "server.wish_history.error": "您的祈愿记录导入失败", - "language.DE": "Deutsch", - "language.EN": "English", - "language.ES": "Español", - "language.FR": "Français", - "language.IT": "Italiano", - "language.PL": "Polski", - "language.PT": "Português", - "language.RU": "Русский", - "language.TH": "แบบไทย", + "action.reset_filters": "重置过滤器", + "filter.element": "元素", + "filter.weapon": "武器", + "sort.rarity": "稀有度", + "sort.name": "名称", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "日期", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "命之座", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", + "language.DE": "德语", + "language.EN": "英语", + "language.ES": "西班牙语", + "language.FR": "法语", + "language.IT": "意大利语", + "language.PL": "波兰语", + "language.PT": "葡萄牙语", + "language.RU": "俄语", + "language.TH": "泰语", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", - "language.ZHT": "繁體中文" + "language.ZHT": "繁体中文" } } diff --git a/src/lib/locales/ZH-T.json b/src/lib/locales/ZH-T.json index 092553d6..24185707 100644 --- a/src/lib/locales/ZH-T.json +++ b/src/lib/locales/ZH-T.json @@ -8,6 +8,7 @@ "action.yes": "是", "action.no": "否", "action.confirm": "確認", + "action.cancel": "Cancel", "action.sort_by": "排序方式", "action.filter_by": "過濾方式", "navigation.category.collection": "你的收藏", @@ -18,6 +19,52 @@ "navigation.logout": "登出", "error.title": "錯誤", "dashboard.title": "首頁", + "dashboard.welcome.title": "Welcome to Dval.in!", + "dashboard.welcome.message": "Your best Genshin Impact companion! Dval.in helps you plan what to farm with an ascension calculator, and it also tracks your progress with a todo list and a wish counter.", + "dashboard.edit_layout.button": "Edit", + "dashboard.edit_layout.title": "Edit the layout", + "dashboard.edit_layout.description": "Edit your homepage layout to fit your needs.", + "dashboard.widget.changelog.title": "Changelog", + "dashboard.widget.reminder.title": "Reminder", + "dashboard.widget.reminder.daily": "Daily", + "dashboard.widget.reminder.daily.teapot_currency": "Teapot currency and friendship", + "dashboard.widget.reminder.daily.commissions": "Daily commissions", + "dashboard.widget.reminder.daily.resin": "Spend resin", + "dashboard.widget.reminder.daily.welkin": "Welkin moon", + "dashboard.widget.reminder.two_day.title": "Every 2 days", + "dashboard.widget.reminder.two_day.local_specialties": "Local specialties", + "dashboard.widget.reminder.two_day.ores": "Ores", + "dashboard.widget.reminder.three_day.title": "Every 3 days", + "dashboard.widget.reminder.three_day.crystals": "Crystal chunks", + "dashboard.widget.reminder.three_day.teapot_farm": "Teapot farms", + "dashboard.widget.reminder.three_day.fishing": "Fishing", + "dashboard.widget.reminder.weekly.title": "Weekly", + "dashboard.widget.reminder.weekly.parametric_transformer": "Parametric transformer", + "dashboard.widget.reminder.weekly.crystalfly_trap": "Crystalfly trap", + "dashboard.widget.reminder.weekly.bosses": "Weekly bosses", + "dashboard.widget.reminder.weekly.reputation": "Reputation bounties", + "dashboard.widget.events.title": "Current Events", + "dashboard.widget.events.version": "For version", + "dashboard.widget.events.timeline.button": "View timeline", + "dashboard.widget.todo.title": "To-do List", + "dashboard.widget.domain.title": "Domain Rotation", + "dashboard.widget.achievements.title": "Achievements", + "dashboard.widget.achievements.progress": "Overall progress", + "dashboard.widget.achievements.latest": "Latest achievements added", + "dashboard.widget.achievements.more": "View more achievements", + "dashboard.widget.pity.title": "Pity", + "dashboard.widget.wishing.title": "Wishing stats", + "dashboard.widget.wishing.pity": "Pity", + "dashboard.widget.wishing.total": "Total wishes", + "dashboard.widget.wishing.latest": "Latest pulls", + "dashboard.widget.display.title": "Display", + "dashboard.widget.global_wishing.title": "Global wishing stats", + "dashboard.widget.global_wishing.percentage": "of all", + "dashboard.widget.global_wishing.pity_average": "Pity average", + "dashboard.widget.global_wishing.based_on": "based on {{number}} submissions", + "dashboard.widget.resin.title": "Resin tracker", + "dashboard.widget.resin.hour": "h", + "dashboard.widget.resin.minute": "m", "wish.detailed.title.WeaponEvent": "武器池記錄", "wish.detailed.title.Standard": "常駐池記錄", "wish.detailed.title.CharacterEvent": "角色池記錄", @@ -46,9 +93,13 @@ "wish.import.instructions.step3": "開啟檔案 \"data_2\"", "wish.import.instructions.step4": "請找到在 \"e20190909gacha-v3\" 裡邊最後的記錄", "wish.import.instructions.step5": "複製並貼上在文字框", + "wish.import.instructions.step6": "Right click \"data_2 file\" -> click Open with, then select Notepad.", + "wish.import.instructions.step7": "Press CTRL + F and select the Wrap Around button. Then input e20190909gacha-v3 in the text box and select direction \"Up\".", + "wish.import.instructions.step8": "Copy the entire link from \"https://public-operation\" until \"game_biz=hk4e_global\", so the link looks something like this: \"https://public-operation-hk4e-sg.hoyoverse.com/genshin/event/e20190909gacha-v3/index.html?.......&game_biz=hk4e_global\"", + "wish.import.instructions.step9": "Paste the link to the textbox below.", "wish.import.state.error.title": "某個地方出現錯誤了,請稍後再試", "wish.import.state.queued.title": "您的申請正在等待處理", - "wish.import.state.queued.description": "Currently, {{count}} requests are waiting in queue", + "wish.import.state.queued.description": "目前有 {{count}} 個申請等待處理", "wish.import.state.active.title": "您的申請正在處理中", "wish.import.state.completed.title": " 您的申請已完成且記錄也已匯入完畢", "wish.import.state.completed.description": "您將可以在 {{date}} 進行再次匯入", @@ -58,29 +109,52 @@ "characters.detailed.tab.constellations.title": "命之座", "characters.detailed.category.builds.title": "角色陪養", "characters.detailed.category.builds.view_on_kqm_button": "見KQM", - "characters.detailed.category.builds.weapons.title": "Weapon", + "characters.detailed.category.builds.weapons.title": "武器", "characters.detailed.category.builds.artifacts.title": "聖遺物", "characters.detailed.category.builds.artifacts.main_stats.title": "主詞條", - "characters.detailed.category.builds.artifacts.sub_stats.title": "Sub stats", + "characters.detailed.category.builds.artifacts.sub_stats.title": "副詞條", "characters.detailed.category.builds.talents.title": "天賦", + "welcome.title": "歡迎使用,旅行者!", + "profile.complete.title": "建立個人檔案以解鎖完整功能", + "profile.complete.description": "建立個人檔案後,您將獲得增強功能和個人化體驗。登入後將能夠從各種來源匯入資料並安全地匯出您的資訊。", + "profile.create.success": "個人檔案建立成功!", + "profile.create.error": "建立個人檔案時出錯誤:{error}", + "profile.create.pending.title": "正在建立個人檔案", + "profile.create.pending.description": "請稍候,我們正在準備您的個人化體驗……", + "profile.create.error.title": "個人檔案建立錯誤", "settings.overview.title": "設定", "settings.category.theming.title": "介面主題", - "settings.category.data.title": "記錄", - "settings.category.data.import_data_button": "Import data", - "settings.category.data.export_data_button": "Export data", - "settings.import.title": "匯入帳號記錄", + "settings.category.data.title": "資料", + "settings.category.data.import_data_button": "匯入資料", + "settings.category.data.export_data_button": "匯出資料", + "settings.login_providers": "登入方式", + "settings.auto_refine_settings": "自動精煉設定", + "settings.auto_refine_3_star": "自動精煉3星武器", + "settings.auto_refine_4_star": "自動精煉4星武器", + "settings.auto_refine_5_star": "自動精煉5星武器", + "settings.save_settings": "儲存設定", + "settings.delete_account": "刪除帳號", + "settings.delete_account_confirmation": "您確定要刪除帳號嗎?此操作不可逆,所有資料將丟失。", + "settings.delete_account_confirm": "刪除帳號", + "settings.import.pending": "匯入資料中,請稍候……", + "settings.import.success.title": "匯入成功!", + "settings.import.success.description": "您的資料已傳送到伺服器。您將被重新導向到設定頁面", + "settings.import.title": "匯入帳號資料", "settings.import.no_file_selected": "無選擇檔案", "settings.import.warning.title": "注意!", - "settings.import.warning.description": "This will overwrite any existing data", + "settings.import.warning.description": "合併資料可能引發意外錯誤", "settings.import.start_import_button": "開始匯入", "settings.import.confirmation_dialog.title": "確認繼續嗎", - "settings.import.confirmation_dialog.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", + "settings.import.confirmation_dialog.description": "Dvalin 將嘗試將您匯入的資料與目前的資料合併。如果出現任何問題,請在 Discord 頻道上報告", + "settings.category.danger_zone.title": "Dangerzone", "login.title": "擁有帳號可以做更多!", + "login.alert.title": "重要:本機資料通知", + "login.alert.description": "登入將覆蓋您的本機資料。請確保在繼續之前已備份所有重要資訊。", "login.perk.cross_device_sync.title": "跨裝置同步", "login.perk.cross_device_sync.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "login.perk.server_access.title": "存取伺服器端功能", "login.perk.server_access.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", - "login.perk.personal_profile.title": "分享您的帳號", + "login.perk.personal_profile.title": "分享您的個人檔案", "login.perk.personal_profile.description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae deserunt velit autem veniam doloribus nulla. Culpa fugiat nemo accusantium cumque soluta tenetur tempora veritatis magnam nulla aliquid. Similique, perspiciatis unde?", "map.title": "地圖", "todo.title": "待辦清單", @@ -98,6 +172,30 @@ "server.wish_history.active": " 您的祈願記錄正在匯入中", "server.wish_history.success": "您的祈願紀錄已匯入完畢", "server.wish_history.error": "您的祈願記錄匯入失敗", + "action.reset_filters": "重設過濾器", + "filter.element": "元素", + "filter.weapon": "武器", + "sort.rarity": "Rarity", + "sort.name": "名稱", + "sort.count": "Count", + "sort.owned": "Owned", + "sort.date": "日期", + "weapons.overview.title": "Weapons", + "weapons.detailed.tab.refinement.title": "Refinement", + "weapons.detailed.tab.stats.title": "Stats", + "weapons.detailed.tab.materials.title": "Materials", + "weapons.title.inventory": "In your inventory", + "sort.constellation": "命之座", + "achievement.title": "Achievements", + "achievement.filter.all": "No filter", + "achievement.filter.version": "Version", + "achievement.filter.type": "Type", + "achievement.filter.hidden": "Hidden", + "achievement.more_info": "More info", + "achievement.unachieved": "Show unachieved first", + "achievement.check_all": "Check All Achievements", + "achievement.show_unachived_category": "Show unachieved categories", + "rarity": "Rarity", "language.DE": "Deutsch", "language.EN": "English", "language.ES": "Español", @@ -107,6 +205,7 @@ "language.PT": "Português", "language.RU": "Русский", "language.TH": "แบบไทย", + "language.VI": "Tiếng Việt", "language.ZHS": "简体中文", "language.ZHT": "繁體中文" } diff --git a/src/lib/services/backend/auth.ts b/src/lib/services/backend/auth.ts index b829f032..1b3722dd 100644 --- a/src/lib/services/backend/auth.ts +++ b/src/lib/services/backend/auth.ts @@ -1,4 +1,5 @@ import { applicationState } from '$lib/store/application_state'; +import { userProfile, defaultValues } from '$lib/store/user_profile'; export class BackendAuthService { private readonly baseUrl: string; @@ -16,6 +17,9 @@ export class BackendAuthService { state.isAuthenticated = false; return state; }); + userProfile.update(() => { + return defaultValues; + }); window.location.href = `${this.baseUrl}/logout`; } diff --git a/src/lib/services/backend/data.ts b/src/lib/services/backend/data.ts index eb908d16..0217259e 100644 --- a/src/lib/services/backend/data.ts +++ b/src/lib/services/backend/data.ts @@ -2,17 +2,16 @@ import { get } from 'svelte/store'; import i18n from '$lib/services/i18n/index'; import type { CharacterKey } from '$lib/types/keys/CharacterKey'; import type { WeaponKey } from '$lib/types/keys/WeaponKey'; -import { createQuery, type QueryClient } from '@tanstack/svelte-query'; +import { createQuery, type CreateQueryResult, type QueryClient } from '@tanstack/svelte-query'; import { backendFetch } from '$lib/services/backend/index'; import type { CharacterIndex } from '$lib/types/index/character'; import type { WeaponIndex } from '$lib/types/index/weapon'; import type { Character } from '$lib/types/data/Character'; -import type { Weapon } from '$lib/types/data/Weapon'; +import type { Weapon } from 'dvalin-data'; +import type { mergedAchievements } from '$lib/types/achievement'; -interface FetchDataIndexResponse { - character: CharacterIndex; - weapon: WeaponIndex; -} +type FetchCharacterDataIndexResponse = CharacterIndex; +type FetchWeaponDataIndexResponse = WeaponIndex; export class BackendDataService { private readonly baseUrl: string; @@ -24,43 +23,48 @@ export class BackendDataService { this.baseUrl = baseUrl + '/data'; } - fetchDataIndex() { - return createQuery( + fetchCharacterDataIndex() { + return createQuery( { - queryKey: ['fetchDataIndex'], + queryKey: ['fetchDataIndex', 'character'], staleTime: 6 * 60 * 60 * 1000, //6h - queryFn: async () => { - const charIndex = await backendFetch( + queryFn: async () => + await backendFetch( `${this.baseUrl}/Character/index?lang=${get(i18n).language}` - ); - const weaponIndex = await backendFetch( - `${this.baseUrl}/Weapon/index?lang=${get(i18n).language}` - ); + ) + }, + this.queryClient + ); + } - return { - character: charIndex, - weapon: weaponIndex - }; - } + fetchWeaponDataIndex() { + return createQuery( + { + queryKey: ['fetchDataIndex', 'weapon'], + staleTime: 6 * 60 * 60 * 1000, //6h + queryFn: async () => + await backendFetch( + `${this.baseUrl}/Weapon/index?lang=${get(i18n).language}` + ) }, this.queryClient ); } - fetchCharacterData(character: CharacterKey) { + fetchCharacterData(lang: string, character: CharacterKey) { return createQuery( { - queryKey: ['fetchCharacterData', character], + queryKey: ['fetchCharacterData', lang, character], staleTime: 6 * 60 * 60 * 1000, //6h queryFn: async () => - await backendFetch(this.getCharacterDataUrl(character)) + await backendFetch(this.getCharacterDataUrl(lang, character)) }, this.queryClient ); } - getCharacterDataUrl(character: CharacterKey) { - return `${this.baseUrl}/Character/${character}?lang=${get(i18n).language}`; + getCharacterDataUrl(lang: string, character: CharacterKey) { + return `${this.baseUrl}/Character/${character}?lang=${lang}`; } fetchWeaponData(weapon: WeaponKey) { @@ -77,4 +81,32 @@ export class BackendDataService { getWeaponDataUrl(weapon: WeaponKey) { return `${this.baseUrl}/Weapon/${weapon}?lang=${get(i18n).language}`; } + + fetchAchievementCategoryList(lang: string): CreateQueryResult { + return createQuery( + { + queryKey: ['fetchAchievementCategoryList', lang], + queryFn: async () => await backendFetch(this.getAchievementCategoryListUrl(lang)) + }, + this.queryClient + ); + } + + getAchievementCategoryListUrl(lang: string): string { + return `${this.baseUrl}/Achievement/index?lang=${lang}`; + } + + fetchAchievements(lang: string, category: string): CreateQueryResult { + return createQuery( + { + queryKey: ['fetchAchievement', lang, category], + queryFn: async () => await backendFetch(this.getAchievementListUrl(lang, category)) + }, + this.queryClient + ); + } + + getAchievementListUrl(lang: string, category: string): string { + return `${this.baseUrl}/Achievement/${category}?lang=${lang}`; + } } diff --git a/src/lib/services/backend/hoyo.ts b/src/lib/services/backend/hoyo.ts index d38f83aa..c7cb8bb2 100644 --- a/src/lib/services/backend/hoyo.ts +++ b/src/lib/services/backend/hoyo.ts @@ -36,7 +36,7 @@ export class BackendHoyoService { { mutationFn: (authkey: string) => backendFetch( - `${this.baseUrl}/wishhistory?authkey=${authkey}` + `${this.baseUrl}/wish?authkey=${authkey}` ) }, this.queryClient @@ -46,7 +46,7 @@ export class BackendHoyoService { fetchHoyoWishHistoryStatus() { return createQuery( derived(applicationState, (appState) => ({ - queryKey: ['fetchHoyoWishhistoryStatus', appState.isAuthenticated], + queryKey: ['fetchHoyoWishStatus', appState.isAuthenticated], staleTime: 60 * 60 * 1000, //1h queryFn: async () => await backendFetch( @@ -59,6 +59,6 @@ export class BackendHoyoService { } getHoyoWishHistoryStatusUrl() { - return `${this.baseUrl}/wishhistory/status`; + return `${this.baseUrl}/wish/status`; } } diff --git a/src/lib/services/backend/index.ts b/src/lib/services/backend/index.ts index e117b17a..d8e1d80a 100644 --- a/src/lib/services/backend/index.ts +++ b/src/lib/services/backend/index.ts @@ -48,6 +48,24 @@ export const backendFetch = async (url: string): Promise => }).then(checkBackendResponse); }; +export const backendPost = async (url: string, body: object): Promise => { + return fetch(url, { + method: 'POST', + credentials: 'include', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(body) + }).then(checkBackendResponse); +}; + +export const backendDelete = async (url: string): Promise => { + return fetch(url, { + method: 'DELETE', + credentials: 'include' + }).then(checkBackendResponse); +}; + export default class BackendService { private env: EnvironmentService = EnvironmentService.getInstance(); private static instance: BackendService | undefined; diff --git a/src/lib/services/backend/user.ts b/src/lib/services/backend/user.ts index 5698693d..61d73dbe 100644 --- a/src/lib/services/backend/user.ts +++ b/src/lib/services/backend/user.ts @@ -1,10 +1,12 @@ -import { createQuery, type QueryClient } from '@tanstack/svelte-query'; -import { backendFetch } from '$lib/services/backend/index'; +import { createMutation, createQuery, type QueryClient } from '@tanstack/svelte-query'; +import { backendDelete, backendFetch, backendPost } from '$lib/services/backend/index'; import type { UserProfile } from '$lib/types/user_profile'; import { applicationState } from '$lib/store/application_state'; import { derived } from 'svelte/store'; -type FetchUserProfileResponse = { state: 'SUCCESS'; data: UserProfile }; +type FetchUserProfileResponse = + | { state: 'NO_GENSHIN_ACCOUNTS' } + | { state: 'SUCCESS'; data: UserProfile }; export class BackendUserService { private readonly baseUrl: string; @@ -27,4 +29,46 @@ export class BackendUserService { this.queryClient ); } + + createUserProfile() { + return createMutation({ + mutationFn: async (data: { uid: number; config: object }) => + await backendPost(`${this.baseUrl}/create`, data) + }); + } + + updateConfig() { + return createMutation({ + mutationFn: async (data: { config: object }) => + await backendPost(`${this.baseUrl}/config`, data) + }); + } + + syncUserProfile() { + return createMutation({ + mutationFn: async (data: { file: object; format: 'paimon' | 'dvalin' }) => + await backendPost(`${this.baseUrl}/sync`, { + ...data.file, + format: data.format + }) + }); + } + + deleteUserProfile() { + return createMutation({ + mutationFn: async () => { + const response = await backendDelete<{ state: 'SUCCESS' }>(`${this.baseUrl}`); + if (response.state === 'SUCCESS') { + this.queryClient.invalidateQueries({ queryKey: ['fetchUserProfile'] }); + return response; + } + throw new Error('Failed to delete user profile'); + }, + onSuccess: () => { + // Optionally, you can perform additional actions on successful deletion + // For example, updating the application state + applicationState.update((state) => ({ ...state, isAuthenticated: false })); + } + }); + } } diff --git a/src/lib/services/i18n/index.ts b/src/lib/services/i18n/index.ts index ac8ecd4a..31c0d641 100644 --- a/src/lib/services/i18n/index.ts +++ b/src/lib/services/i18n/index.ts @@ -11,6 +11,7 @@ import PL from '$lib/locales/PL.json'; import PT from '$lib/locales/PT.json'; import RU from '$lib/locales/RU.json'; import TH from '$lib/locales/TH.json'; +import VI from '$lib/locales/VI.json'; import ZHS from '$lib/locales/ZH-S.json'; import ZHT from '$lib/locales/ZH-T.json'; import { goto } from '$app/navigation'; @@ -34,6 +35,7 @@ i18next PT, RU, TH, + VI, ZHS, ZHT } diff --git a/src/lib/services/importer/dvalin.ts b/src/lib/services/importer/dvalin.ts deleted file mode 100644 index 93a77ea9..00000000 --- a/src/lib/services/importer/dvalin.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { IImporterService } from '$lib/services/importer/index'; -import { isDvalinUserProfile, type UserProfile } from '$lib/types/user_profile'; - -export class DvalinImporterService implements IImporterService { - import(data: unknown): UserProfile { - if (isDvalinUserProfile(data)) { - return { - ...data - }; - } - throw new Error('Make sure you upload the right file format'); - } -} diff --git a/src/lib/services/importer/index.ts b/src/lib/services/importer/index.ts deleted file mode 100644 index e0597acc..00000000 --- a/src/lib/services/importer/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PaimonMoeImporterService } from '$lib/services/importer/paimon'; -import { DvalinImporterService } from '$lib/services/importer/dvalin'; -import type { UserProfile } from '$lib/types/user_profile'; - -const importerServices: { [key: string]: IImporterService } = { - dvalin: new DvalinImporterService(), - paimon: new PaimonMoeImporterService() -}; - -export type ImporterServices = keyof typeof importerServices; - -export interface IImporterService { - import(data: unknown): UserProfile; -} - -export default class ImporterService { - getImporterService(key: ImporterServices) { - return importerServices[key]; - } -} diff --git a/src/lib/services/importer/paimon.ts b/src/lib/services/importer/paimon.ts deleted file mode 100644 index 55d7ef0c..00000000 --- a/src/lib/services/importer/paimon.ts +++ /dev/null @@ -1,664 +0,0 @@ -import { isPaimonData, type PaimonCharacters, type PaimonPulls } from '$lib/types/import/paimon'; -import { isServerKey } from '$lib/types/keys/ServerKey'; -import type { IWish } from '$lib/types/wish'; -import type { WeaponKey } from '$lib/types/keys/WeaponKey'; -import type { CharacterKey } from '$lib/types/keys/CharacterKey'; -import type { ICharacters } from '$lib/types/character'; -import type { BannerKey } from '$lib/types/keys/BannerKey'; -import type { IImporterService } from '$lib/services/importer/index'; -import type { UserProfile } from '$lib/types/user_profile'; - -function convertPaimonCharacter(paimonPullId: string): CharacterKey { - switch (paimonPullId) { - case 'albedo': - return 'Albedo'; - case 'alhaitham': - return 'Alhaitham'; - case 'aloy': - return 'Aloy'; - case 'amber': - return 'Amber'; - case 'arataki_itto': - return 'AratakiItto'; - case 'baizhu': - return 'Baizhu'; - case 'barbara': - return 'Barbara'; - case 'beidou': - return 'Beidou'; - case 'bennett': - return 'Bennett'; - case 'candace': - return 'Candace'; - case 'charlotte': - return 'Charlotte'; - case 'chevreuse': - return 'Chevreuse'; - case 'chongyun': - return 'Chongyun'; - case 'chiori': - return 'Chiori'; - case 'collei': - return 'Collei'; - case 'cyno': - return 'Cyno'; - case 'dehya': - return 'Dehya'; - case 'diluc': - return 'Diluc'; - case 'diona': - return 'Diona'; - case 'dori': - return 'Dori'; - case 'eula': - return 'Eula'; - case 'faruzan': - return 'Faruzan'; - case 'fischl': - return 'Fischl'; - case 'freminet': - return 'Freminet'; - case 'furina': - return 'Furina'; - case 'gaming': - return 'Gaming'; - case 'ganyu': - return 'Ganyu'; - case 'gorou': - return 'Gorou'; - case 'hu_tao': - return 'HuTao'; - case 'jean': - return 'Jean'; - case 'kaedehara_kazuha': - return 'KaedeharaKazuha'; - case 'kaeya': - return 'Kaeya'; - case 'kamisato_ayaka': - return 'KamisatoAyaka'; - case 'kamisato_ayato': - return 'KamisatoAyato'; - case 'kaveh': - return 'Kaveh'; - case 'keqing': - return 'Keqing'; - case 'kirara': - return 'Kirara'; - case 'klee': - return 'Klee'; - case 'kujou_sara': - return 'KujouSara'; - case 'kuki_shinobu': - return 'KukiShinobu'; - case 'layla': - return 'Layla'; - case 'lisa': - return 'Lisa'; - case 'lynette': - return 'Lynette'; - case 'lyney': - return 'Lyney'; - case 'mika': - return 'Mika'; - case 'mona': - return 'Mona'; - case 'nahida': - return 'Nahida'; - case 'navia': - return 'Navia'; - case 'neuvillette': - return 'Neuvillette'; - case 'nilou': - return 'Nilou'; - case 'ningguang': - return 'Ningguang'; - case 'noelle': - return 'Noelle'; - case 'qiqi': - return 'Qiqi'; - case 'raiden_shogun': - return 'RaidenShogun'; - case 'razor': - return 'Razor'; - case 'rosaria': - return 'Rosaria'; - case 'sangonomiya_kokomi': - return 'SangonomiyaKokomi'; - case 'sayu': - return 'Sayu'; - case 'shenhe': - return 'Shenhe'; - case 'shikanoin_heizou': - return 'ShikanoinHeizou'; - case 'somnia': - return 'Somnia'; - case 'sucrose': - return 'Sucrose'; - case 'tartaglia': - return 'Tartaglia'; - case 'thoma': - return 'Thoma'; - case 'tighnari': - return 'Tighnari'; - case 'traveler_geo': - case 'traveler_anemo': - case 'traveler_electro': - case 'traveler_dendro': - case 'traveler_hydro': - return 'Traveler'; - case 'venti': - return 'Venti'; - case 'wanderer': - return 'Wanderer'; - case 'wriothesley': - return 'Wriothesley'; - case 'xiangling': - return 'Xiangling'; - case 'xianyun': - return 'Xianyun'; - case 'xiao': - return 'Xiao'; - case 'xingqiu': - return 'Xingqiu'; - case 'xinyan': - return 'Xinyan'; - case 'yae_miko': - return 'YaeMiko'; - case 'yanfei': - return 'Yanfei'; - case 'yaoyao': - return 'Yaoyao'; - case 'yelan': - return 'Yelan'; - case 'yoimiya': - return 'Yoimiya'; - case 'yun_jin': - return 'YunJin'; - case 'zhongli': - return 'Zhongli'; - default: - throw new Error('Unknown key ' + paimonPullId); - } -} - -function convertPaimonWeapon(paimonPullId: string): WeaponKey { - switch (paimonPullId) { - case 'unknown_3_star': - return 'Unknown3Star'; - case 'a_thousand_floating_dreams': - return 'AThousandFloatingDreams'; - case 'akuoumaru': - return 'Akuoumaru'; - case 'alley_hunter': - return 'AlleyHunter'; - case 'amenoma_kageuchi': - return 'AmenomaKageuchi'; - case 'amos_bow': - return 'AmosBow'; - case 'apprentices_notes': - return 'ApprenticesNotes'; - case 'aqua_simulacra': - return 'AquaSimulacra'; - case 'aquila_favonia': - return 'AquilaFavonia'; - case 'ballad_of_the_boundless_blue': - return 'BalladOfTheBoundlessBlue'; - case 'ballad_of_the_fjords': - return 'BalladOfTheFjords'; - case 'beacon_of_the_reed_sea': - return 'BeaconOfTheReedSea'; - case 'beginners_protector': - return 'BeginnersProtector'; - case 'black_tassel': - return 'BlackTassel'; - case 'blackcliff_agate': - return 'BlackcliffAgate'; - case 'blackcliff_longsword': - return 'BlackcliffLongsword'; - case 'blackcliff_pole': - return 'BlackcliffPole'; - case 'blackcliff_slasher': - return 'BlackcliffSlasher'; - case 'blackcliff_warbow': - return 'BlackcliffWarbow'; - case 'bloodtainted_greatsword': - return 'BloodtaintedGreatsword'; - case 'calamity_queller': - return 'CalamityQueller'; - case 'cashflow_supervision': - return 'CashflowSupervision'; - case 'cinnabar_spindle': - return 'CinnabarSpindle'; - case 'compound_bow': - return 'CompoundBow'; - case 'cool_steel': - return 'CoolSteel'; - case 'cranes_echoing_call': - return 'CranesEchoingCall'; - case 'crescent_pike': - return 'CrescentPike'; - case 'dark_iron_sword': - return 'DarkIronSword'; - case 'deathmatch': - return 'Deathmatch'; - case 'debate_club': - return 'DebateClub'; - case 'dialogues_of_the_desert_sages': - return 'DialoguesOfTheDesertSages'; - case 'dodoco_tales': - return 'DodocoTales'; - case 'dragons_bane': - return 'DragonsBane'; - case 'dragonspine_spear': - return 'DragonspineSpear'; - case 'dull_blade': - return 'DullBlade'; - case 'elegy_for_the_end': - return 'ElegyForTheEnd'; - case 'emerald_orb': - return 'EmeraldOrb'; - case 'end_of_the_line': - return 'EndOfTheLine'; - case 'engulfing_lightning': - return 'EngulfingLightning'; - case 'everlasting_moonglow': - return 'EverlastingMoonglow'; - case 'eye_of_perception': - return 'EyeOfPerception'; - case 'fading_twilight': - return 'FadingTwilight'; - case 'favonius_codex': - return 'FavoniusCodex'; - case 'favonius_greatsword': - return 'FavoniusGreatsword'; - case 'favonius_lance': - return 'FavoniusLance'; - case 'favonius_sword': - return 'FavoniusSword'; - case 'favonius_warbow': - return 'FavoniusWarbow'; - case 'ferrous_shadow': - return 'FerrousShadow'; - case 'festering_desire': - return 'FesteringDesire'; - case 'fillet_blade': - return 'FilletBlade'; - case 'finale_of_the_deep': - return 'FinaleOfTheDeep'; - case 'fleuve_cendre_ferryman': - return 'FleuveCendreFerryman'; - case 'flowing_purity': - return 'FlowingPurity'; - case 'forest_regalia': - return 'ForestRegalia'; - case 'freedom-sworn': - return 'FreedomSworn'; - case 'frostbearer': - return 'Frostbearer'; - case 'fruit_of_fulfillment': - return 'FruitOfFulfillment'; - case 'hakushin_ring': - return 'HakushinRing'; - case 'halberd': - return 'Halberd'; - case 'hamayumi': - return 'Hamayumi'; - case 'haran_geppaku_futsu': - return 'HaranGeppakuFutsu'; - case 'harbinger_of_dawn': - return 'HarbingerOfDawn'; - case 'hunters_bow': - return 'HuntersBow'; - case 'hunters_path': - return 'HuntersPath'; - case 'ibis_piercer': - return 'IbisPiercer'; - case 'iron_point': - return 'IronPoint'; - case 'iron_sting': - return 'IronSting'; - case 'jadefalls_splendor': - return 'JadefallsSplendor'; - case 'kagotsurube_isshin': - return 'KagotsurubeIsshin'; - case 'kaguras_verity': - return 'KagurasVerity'; - case 'katsuragikiri_nagamasa': - return 'KatsuragikiriNagamasa'; - case 'key_of_khaj-nisut': - return 'KeyOfKhajNisut'; - case 'kings_squire': - return 'KingsSquire'; - case 'kitain_cross_spear': - return 'KitainCrossSpear'; - case 'light_of_foliar_incision': - return 'LightOfFoliarIncision'; - case 'lions_roar': - return 'LionsRoar'; - case 'lithic_blade': - return 'LithicBlade'; - case 'lithic_spear': - return 'LithicSpear'; - case 'lost_prayer_to_the_sacred_winds': - return 'LostPrayerToTheSacredWinds'; - case 'luxurious_sea_lord': - return 'LuxuriousSeaLord'; - case 'magic_guide': - return 'MagicGuide'; - case 'mailed_flower': - return 'MailedFlower'; - case 'makhaira_aquamarine': - return 'MakhairaAquamarine'; - case 'mappa_mare': - return 'MappaMare'; - case 'memory_of_dust': - return 'MemoryOfDust'; - case 'messenger': - return 'Messenger'; - case 'missive_windspear': - return 'MissiveWindspear'; - case 'mistsplitter_reforged': - return 'MistsplitterReforged'; - case 'mitternachts_waltz': - return 'MitternachtsWaltz'; - case 'moonpiercer': - return 'Moonpiercer'; - case 'mouuns_moon': - return 'MouunsMoon'; - case 'oathsworn_eye': - return 'OathswornEye'; - case 'old_mercs_pal': - return 'OldMercsPal'; - case 'otherworldly_story': - return 'OtherworldlyStory'; - case 'pocket_grimoire': - return 'PocketGrimoire'; - case 'polar_star': - return 'PolarStar'; - case 'portable_power_saw': - return 'PortablePowerSaw'; - case 'predator': - return 'Predator'; - case 'primordial_jade_cutter': - return 'PrimordialJadeCutter'; - case 'primordial_jade_winged-spear': - return 'PrimordialJadeWingedSpear'; - case 'prospectors_drill': - return 'ProspectorsDrill'; - case 'prototype_amber': - return 'PrototypeAmber'; - case 'prototype_archaic': - return 'PrototypeArchaic'; - case 'prototype_crescent': - return 'PrototypeCrescent'; - case 'prototype_rancour': - return 'PrototypeRancour'; - case 'prototype_starglitter': - return 'PrototypeStarglitter'; - case 'quantum_catalyst': - return 'QuantumCatalyst'; - case 'rainslasher': - return 'Rainslasher'; - case 'range_gauge': - return 'RangeGauge'; - case 'raven_bow': - return 'RavenBow'; - case 'recurve_bow': - return 'RecurveBow'; - case 'redhorn_stonethresher': - return 'RedhornStonethresher'; - case 'rightful_reward': - return 'RightfulReward'; - case 'royal_bow': - return 'RoyalBow'; - case 'royal_greatsword': - return 'RoyalGreatsword'; - case 'royal_grimoire': - return 'RoyalGrimoire'; - case 'royal_longsword': - return 'RoyalLongsword'; - case 'royal_spear': - return 'RoyalSpear'; - case 'rust': - return 'Rust'; - case 'sacrificial_bow': - return 'SacrificialBow'; - case 'sacrificial_fragments': - return 'SacrificialFragments'; - case 'sacrificial_greatsword': - return 'SacrificialGreatsword'; - case 'sacrificial_jade': - return 'SacrificialJade'; - case 'sacrificial_sword': - return 'SacrificialSword'; - case 'sapwood_blade': - return 'SapwoodBlade'; - case 'scion_of_the_blazing_sun': - return 'ScionOfTheBlazingSun'; - case 'seasoned_hunters_bow': - return 'SeasonedHuntersBow'; - case 'serpent_spine': - return 'SerpentSpine'; - case 'sharpshooters_oath': - return 'SharpshootersOath'; - case 'silver_sword': - return 'SilverSword'; - case 'skyrider_greatsword': - return 'SkyriderGreatsword'; - case 'skyrider_sword': - return 'SkyriderSword'; - case 'skyward_atlas': - return 'SkywardAtlas'; - case 'skyward_blade': - return 'SkywardBlade'; - case 'skyward_harp': - return 'SkywardHarp'; - case 'skyward_pride': - return 'SkywardPride'; - case 'skyward_spine': - return 'SkywardSpine'; - case 'slingshot': - return 'Slingshot'; - case 'snow_tombed_starsilver': - return 'SnowTombedStarsilver'; - case 'solar_pearl': - return 'SolarPearl'; - case 'song_of_broken_pines': - return 'SongOfBrokenPines'; - case 'song_of_stillness': - return 'SongOfStillness'; - case 'splendor_of_tranquil_waters': - return 'SplendorOfTranquilWaters'; - case 'staff_of_homa': - return 'StaffOfHoma'; - case 'staff_of_the_scarlet_sands': - return 'StaffOfTheScarletSands'; - case 'summit_shaper': - return 'SummitShaper'; - case 'sword_of_descension': - return 'SwordOfDescension'; - case 'sword_of_narzissenkreuz': - return 'SwordOfNarzissenkreuz'; - case 'talking_stick': - return 'TalkingStick'; - case 'the_alley_flash': - return 'TheAlleyFlash'; - case 'the_bell': - return 'TheBell'; - case 'the_black_sword': - return 'TheBlackSword'; - case 'the_catch': - return 'TheCatch'; - case 'the_dockhands_assistant': - return 'TheDockhandsAssistant'; - case 'the_first_great_magic': - return 'TheFirstGreatMagic'; - case 'the_flute': - return 'TheFlute'; - case 'the_stringless': - return 'TheStringless'; - case 'the_unforged': - return 'TheUnforged'; - case 'the_viridescent_hunt': - return 'TheViridescentHunt'; - case 'the_widsith': - return 'TheWidsith'; - case 'thrilling_tales_of_dragon_slayers': - return 'ThrillingTalesOfDragonSlayers'; - case 'thundering_pulse': - return 'ThunderingPulse'; - case 'tidal_shadow': - return 'TidalShadow'; - case 'tome_of_the_eternal_flow': - return 'TomeOfTheEternalFlow'; - case 'toukabou_shigure': - return 'ToukabouShigure'; - case 'travelers_handy_sword': - return 'TravelersHandySword'; - case 'tulaytullahs_remembrance': - return 'TulaytullahsRemembrance'; - case 'twin_nephrite': - return 'TwinNephrite'; - case 'ultimate_overlords_mega_magic_sword': - return 'UltimateOverlordsMegaMagicSword'; - case 'uraku_misugiri': - return 'UrakuMisugiri'; - case 'verdict': - return 'Verdict'; - case 'vortex_vanquisher': - return 'VortexVanquisher'; - case 'wandering_evenstar': - return 'WanderingEvenstar'; - case 'waster_greatsword': - return 'WasterGreatsword'; - case 'wavebreakers_fin': - return 'WavebreakersFin'; - case 'white_iron_greatsword': - return 'WhiteIronGreatsword'; - case 'white_tassel': - return 'WhiteTassel'; - case 'whiteblind': - return 'Whiteblind'; - case 'windblume_ode': - return 'WindblumeOde'; - case 'wine_and_song': - return 'WineAndSong'; - case 'wolf_fang': - return 'WolfFang'; - case 'wolfs_gravestone': - return 'WolfsGravestone'; - case 'xiphos_moonlight': - return 'XiphosMoonlight'; - default: - throw new Error('Unknown key ' + paimonPullId); - } -} - -function convertPaimonId( - paimonPullId: string, - paimonPullType: 'character' | 'weapon' -): CharacterKey | WeaponKey { - return paimonPullType === 'character' - ? convertPaimonCharacter(paimonPullId) - : convertPaimonWeapon(paimonPullId); -} - -function convertPaimonType(paimonPullType: 'character' | 'weapon'): 'Character' | 'Weapon' { - switch (paimonPullType) { - case 'character': - return 'Character'; - case 'weapon': - return 'Weapon'; - } -} - -function convertWishDateToBanner(): BannerKey { - return 'BalladInGoblets1'; -} - -function convertPaimonWishes(paimonWish: PaimonPulls[]): IWish[] { - return paimonWish.toReversed().flatMap((pull, count) => { - return { - type: convertPaimonType(pull.type), - number: paimonWish.length - count, - key: convertPaimonId(pull.id, pull.type), - date: new Date(pull.time), - pity: pull.pity, - banner: convertWishDateToBanner() - }; - }); -} - -function convertPaimonCharacters(paimonCharacters: PaimonCharacters): ICharacters { - const convertedCharacters: ICharacters = {}; - - Object.keys(paimonCharacters).forEach((key) => { - const convertedKey = convertPaimonCharacter(key); - - convertedCharacters[convertedKey] = { - level: 0, - constellation: 0, - ascension: 0, - talent: { - auto: 0, - skill: 0, - burst: 0 - } - }; - }); - - return convertedCharacters; -} - -export class PaimonMoeImporterService implements IImporterService { - import(data: unknown): UserProfile { - if (isPaimonData(data)) { - return { - format: 'dvalin', - version: 0, - user: { - ar: data.ar, - ...(data.server !== undefined && isServerKey(data.server) - ? { server: data.server } - : undefined), - ...(data['wish-uid'] !== undefined ? { uid: data['wish-uid'] } : undefined), - wl: data.wl - }, - ...(data.characters !== undefined - ? { characters: convertPaimonCharacters(data.characters) } - : undefined), - wishes: { - ...(data['wish-counter-character-event'] !== undefined - ? { - CharacterEvent: convertPaimonWishes( - data['wish-counter-character-event'].pulls - ) - } - : undefined), - ...(data['wish-counter-weapon-event'] !== undefined - ? { - WeaponEvent: convertPaimonWishes( - data['wish-counter-weapon-event'].pulls - ) - } - : undefined), - ...(data['wish-counter-standard'] !== undefined - ? { Standard: convertPaimonWishes(data['wish-counter-standard'].pulls) } - : undefined), - ...(data['wish-counter-beginners'] !== undefined - ? { Beginner: convertPaimonWishes(data['wish-counter-beginners'].pulls) } - : undefined), - ...(data['wish-counter-chronicled'] !== undefined - ? { - Chronicled: convertPaimonWishes( - data['wish-counter-chronicled'].pulls - ) - } - : undefined) - } - }; - } else { - throw new Error('Make sure you upload the right file format'); - } - } -} diff --git a/src/lib/services/s3.ts b/src/lib/services/s3.ts index 8043be5e..3d57aa8c 100644 --- a/src/lib/services/s3.ts +++ b/src/lib/services/s3.ts @@ -3,7 +3,7 @@ import type { WeaponKey } from '$lib/types/keys/WeaponKey'; import type { ArtifactSetKey } from '$lib/types/keys/ArtifactSetKey'; export default class S3Service { - static baseUrl: string = 'https://s3-api.dval.in'; + static readonly baseUrl: string = 'https://s3-api.dval.in'; public static getCharacter(character: CharacterKey) { return new S3CharacterBucket(character); @@ -16,6 +16,22 @@ export default class S3Service { public static getArtifact(artifact: ArtifactSetKey) { return new S3ArtifactBucket(artifact); } + + public static getNamecard(key: string) { + return new S3NamecardBucket(key); + } + + public static getAchievementCategory(achievementCategory: string) { + return new S3AchievementBucket(achievementCategory); + } +} + +class S3NamecardBucket { + public url: string; + + public constructor(key: string) { + this.url = S3Service.baseUrl + '/namecards/' + key + '.webp'; + } } class S3CharacterBucket { @@ -63,3 +79,14 @@ class S3ArtifactBucket { this.sands = this.baseUrl + '/sands.webp'; } } + +class S3AchievementBucket { + private readonly baseUrl: string; + + public icon; + + public constructor(achievementCategory: string) { + this.baseUrl = S3Service.baseUrl + '/achievements/categories/' + achievementCategory; + this.icon = this.baseUrl + '.webp'; + } +} diff --git a/src/lib/services/socketServer.ts b/src/lib/services/socketServer.ts new file mode 100644 index 00000000..0516b3ff --- /dev/null +++ b/src/lib/services/socketServer.ts @@ -0,0 +1,65 @@ +// socketServer.ts +import { io, Socket } from 'socket.io-client'; +import { get } from 'svelte/store'; +import { toast } from 'svelte-sonner'; +import { applicationState } from '$lib/store/application_state'; +import type { QueryClient } from '@tanstack/svelte-query'; +import i18n from '$lib/services/i18n'; +import { writable } from 'svelte/store'; + +export const socketStore = writable(null); + +export class SocketServer { + private socket: Socket; + private queryClient: QueryClient; + + constructor(backendUrl: string, queryClient: QueryClient) { + this.socket = io(backendUrl, { withCredentials: true }); + this.queryClient = queryClient; + this.setupEventListeners(); + socketStore.set(this.socket); + } + + private setupEventListeners() { + this.socket.on('authenticationState', this.handleAuthenticationState); + this.socket.on('invalidateQuery', this.handleInvalidateQuery); + this.socket.on('toast', this.handleToast); + } + + private handleAuthenticationState = (authenticationState: boolean) => { + applicationState.update((state) => ({ + ...state, + isAuthenticated: authenticationState + })); + }; + + private handleInvalidateQuery = (queryKey: string[]) => { + this.queryClient.invalidateQueries({ queryKey }); + }; + + private handleToast = (toastMessage: { + type: 'success' | 'error' | 'info' | 'loading'; + message: string; + }) => { + const message = get(i18n).t(toastMessage.message); + + switch (toastMessage.type) { + case 'success': + return toast.success(message); + case 'error': + return toast.error(message); + case 'info': + return toast.info(message); + case 'loading': + return toast.loading(message); + } + }; + + public getSocket() { + return this.socket; + } +} + +export const createSocketServer = (backendUrl: string, queryClient: QueryClient) => { + return new SocketServer(backendUrl, queryClient); +}; diff --git a/src/lib/store/index_store.ts b/src/lib/store/index_store.ts index bec473c3..dfff2b11 100644 --- a/src/lib/store/index_store.ts +++ b/src/lib/store/index_store.ts @@ -7,7 +7,7 @@ const defaultValues: { character: CharacterIndex; weapon: WeaponIndex } = { weapon: {} }; -export const dataIndexStore = persisted('dataIndex', defaultValues, { +export const dataIndex = persisted('dataIndex', defaultValues, { storage: 'local', syncTabs: true }); diff --git a/src/lib/store/user_profile.ts b/src/lib/store/user_profile.ts index e476ed13..abd4e6b9 100644 --- a/src/lib/store/user_profile.ts +++ b/src/lib/store/user_profile.ts @@ -1,14 +1,24 @@ import { persisted } from 'svelte-persisted-store'; import type { UserProfile } from '$lib/types/user_profile'; -const defaultValues: UserProfile = { +export const defaultValues: UserProfile = { format: 'dvalin', version: 0, - user: { + config: { + autoRefine3: false, + autoRefine4: false, + autoRefine5: false, + preferedLanguage: 'en' + }, + account: { ar: 0, uid: 0, - wl: 0 - } + wl: 0, + name: '', + server: '', + namecard: '' + }, + auth: [] }; export const userProfile = persisted('userProfile', defaultValues, { diff --git a/src/lib/types/achievement.ts b/src/lib/types/achievement.ts index f88d65c9..200980e5 100644 --- a/src/lib/types/achievement.ts +++ b/src/lib/types/achievement.ts @@ -1,16 +1,31 @@ -import type { AchievementCategoryKey } from '$lib/types/keys/AchievementCategoryKey'; -import type { AchievementKey } from '$lib/types/keys/AchievementKey'; - -export type IAchievementCategory = { - [key in AchievementCategoryKey]: IAchievements; +export type IAchievements = { + [key in number]: { + achieved: boolean; + progression: string; + }; }; -export type IAchievements = { - [key in AchievementKey]: IAchievement; +export type mergedAchievements = { + achievements: achievementData[]; + id: string; + name: string; + order: number; + version: string; }; -export type IAchievement = { - category: AchievementCategoryKey; - achieved: boolean; - preStage?: AchievementKey; // Refer to the previous achievements of a series +export type achievementData = { + requirements: string; + requirementQuestLink: string; + hidden: string; + type: string; + version: string; + steps: string | string[]; + id: number; + name: string; + desc: string; + reward: number; + order: number; + preStage?: number; + achieved?: boolean; + progression?: string; }; diff --git a/src/lib/types/artifact.ts b/src/lib/types/artifact.ts index 445c5107..1e16eac2 100644 --- a/src/lib/types/artifact.ts +++ b/src/lib/types/artifact.ts @@ -1,7 +1,7 @@ -import type { ArtifactSetKey } from '$lib/types/keys/ArtifactSetKey'; -import type { SlotKey } from '$lib/types/keys/SlotKey'; -import type { StatKey } from '$lib/types/keys/StatKey'; -import type { CharacterKey } from '$lib/types/keys/CharacterKey'; +import type { SlotKey } from './artifact_slot'; +import type { StatKey } from './artifact_stat'; +import type { ArtifactSetKey } from './keys/ArtifactSetKey'; +import type { CharacterKey } from './keys/CharacterKey'; export type IArtifact = { setKey: ArtifactSetKey; // E.g. "GladiatorsFinale" @@ -9,12 +9,12 @@ export type IArtifact = { level: number; // 0-20 inclusive rarity: number; // 1-5 inclusive mainStatKey: StatKey; - location: CharacterKey | ''; // Where "" means not equipped. + characterKey: CharacterKey | ''; // Where "" means not equipped. lock: boolean; // Whether the artifact is locked in game. substats: ISubstat[]; }; export type ISubstat = { - key: StatKey; // E.g. "critDMG_" + key: StatKey; value: number; // E.g. 19.4 }; diff --git a/src/lib/types/artifact_slot.ts b/src/lib/types/artifact_slot.ts new file mode 100644 index 00000000..49eb2d82 --- /dev/null +++ b/src/lib/types/artifact_slot.ts @@ -0,0 +1,6 @@ +const slotKeys = ['flower', 'plume', 'sands', 'goblet', 'circlet']; +export type SlotKey = (typeof slotKeys)[number]; + +export const isSlotKey = (key: string): key is SlotKey => { + return slotKeys.includes(key); +}; diff --git a/src/lib/types/artifact_stat.ts b/src/lib/types/artifact_stat.ts new file mode 100644 index 00000000..415badf0 --- /dev/null +++ b/src/lib/types/artifact_stat.ts @@ -0,0 +1,27 @@ +const statKeys = [ + 'hp', + 'hp%', + 'atk', + 'atk%', + 'def', + 'def%', + 'elementalMastery', + 'energyRecharge', + 'healingBonus', + 'critRate', + 'critDMG', + 'physicalDmg', + 'anemoDmg', + 'geoDmg', + 'electroDmg', + 'hydroDmg', + 'pyroDmg', + 'cryoDmg', + 'dendroDmg' +]; + +export type StatKey = (typeof statKeys)[number]; + +export const isStatKey = (key: string): key is StatKey => { + return statKeys.includes(key); +}; diff --git a/src/lib/types/character.ts b/src/lib/types/character.ts index 80030f0e..7e5039eb 100644 --- a/src/lib/types/character.ts +++ b/src/lib/types/character.ts @@ -1,7 +1,7 @@ -import type { CharacterKey } from '$lib/types/keys/CharacterKey'; +import type { CharacterKey } from './keys/CharacterKey'; export type ICharacters = { - [key in CharacterKey]?: ICharacter; + [key in CharacterKey]: ICharacter; // E.g. "Rosaria" }; export type ICharacter = { @@ -9,9 +9,10 @@ export type ICharacter = { constellation: number; // 0-6 inclusive ascension: number; // 0-6 inclusive. need to disambiguate 80/90 or 80/80 talent: { - // Does not include boost from constellations. 1-15 inclusive + // Does not include boost from constellations. auto: number; skill: number; burst: number; }; + manualConstellations: number; // constellation added by the user }; diff --git a/src/lib/types/config.ts b/src/lib/types/config.ts new file mode 100644 index 00000000..7bd4350e --- /dev/null +++ b/src/lib/types/config.ts @@ -0,0 +1,8 @@ +import type { Locale } from './locale'; + +export type Config = { + autoRefine3: boolean; + autoRefine4: boolean; + autoRefine5: boolean; + preferedLanguage: Locale; +}; diff --git a/src/lib/types/index/weapon.ts b/src/lib/types/index/weapon.ts index c60454f3..4ef3f553 100644 --- a/src/lib/types/index/weapon.ts +++ b/src/lib/types/index/weapon.ts @@ -4,5 +4,6 @@ export type WeaponIndex = { [key in WeaponKey]: { name: string; rarity: number; + type: string; }; }; diff --git a/src/lib/types/locale.ts b/src/lib/types/locale.ts index fe6e14b6..77997fea 100644 --- a/src/lib/types/locale.ts +++ b/src/lib/types/locale.ts @@ -1,4 +1,4 @@ -const localeList = ['DE', 'EN', 'ES', 'FR', 'IT', 'PL', 'PT', 'RU', 'TH', 'ZHS', 'ZHT']; +const localeList = ['DE', 'EN', 'ES', 'FR', 'IT', 'PL', 'PT', 'RU', 'TH', 'VI', 'ZHS', 'ZHT']; export type Locale = (typeof localeList)[number]; diff --git a/src/lib/types/server.ts b/src/lib/types/server.ts new file mode 100644 index 00000000..6dd553dc --- /dev/null +++ b/src/lib/types/server.ts @@ -0,0 +1,7 @@ +const serverKeys = ['Europe', 'America', 'Asia', 'HK-TW', 'China']; + +export type ServerKey = (typeof serverKeys)[number]; + +export const isServerKey = (key: string): key is ServerKey => { + return serverKeys.includes(key); +}; diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts index 21eb3c1c..4794264e 100644 --- a/src/lib/types/user.ts +++ b/src/lib/types/user.ts @@ -1,8 +1,11 @@ -import type { ServerKey } from '$lib/types/keys/ServerKey'; +import type { ServerKey } from './server'; export interface IUser { - server?: ServerKey; + server: ServerKey; ar: number; - uid?: number; + uid: number; wl: number; + name: string; + namecard: string; + signature?: string; } diff --git a/src/lib/types/user_profile.ts b/src/lib/types/user_profile.ts index afe87894..41cc10e2 100644 --- a/src/lib/types/user_profile.ts +++ b/src/lib/types/user_profile.ts @@ -1,17 +1,21 @@ import type { IUser } from '$lib/types/user'; import type { ICharacters } from '$lib/types/character'; import type { IArtifact } from '$lib/types/artifact'; -import type { IAchievementCategory } from '$lib/types/achievement'; +import type { IAchievements } from '$lib/types/achievement'; import type { IFurnishings } from '$lib/types/furnishing'; import type { IMaterials } from '$lib/types/material'; import type { IWeapon } from '$lib/types/weapon'; import type { IWishes } from '$lib/types/wish'; +import type { Config } from './config'; export interface UserProfile { format: 'dvalin'; version: number; - user?: IUser; - achievements?: IAchievementCategory; + config: Config; + account: IUser; + auth: string[]; + lastUpdated?: Date; + achievements?: IAchievements; artifacts?: IArtifact[]; characters?: ICharacters; furnishing?: IFurnishings; diff --git a/src/lib/types/weapon.ts b/src/lib/types/weapon.ts index 91b369b5..f57441b8 100644 --- a/src/lib/types/weapon.ts +++ b/src/lib/types/weapon.ts @@ -1,13 +1,13 @@ -import type { WeaponKey } from '$lib/types/keys/WeaponKey'; import type { CharacterKey } from '$lib/types/keys/CharacterKey'; +import type { WeaponKey } from './keys/WeaponKey'; export type WeaponTypes = 'bow' | 'catalyst' | 'claymore' | 'polearm' | 'sword'; export type IWeapon = { - key: WeaponKey; // "CrescentPike" + id: WeaponKey; // "CrescentPike" + key: string; // "CrescentPike" level: number; // 1-90 inclusive ascension: number; // 0-6 inclusive. need to disambiguate 80/90 or 80/80 refinement: number; // 1-5 inclusive - location: CharacterKey | ''; // Where "" means not equipped. - lock: boolean; // Whether the weapon is locked in game. + characterKey?: CharacterKey; }; diff --git a/src/lib/types/wish.ts b/src/lib/types/wish.ts index 8c382dad..eb4833fc 100644 --- a/src/lib/types/wish.ts +++ b/src/lib/types/wish.ts @@ -1,32 +1,29 @@ import type { WishBannerKey } from '$lib/types/keys/WishBannerKey'; import type { WeaponKey } from '$lib/types/keys/WeaponKey'; import type { CharacterKey } from '$lib/types/keys/CharacterKey'; -import type { BannerKey } from '$lib/types/keys/BannerKey'; export type IWishes = { [key in WishBannerKey]?: IWish[]; }; -export type IMappedWishes = { - [key in WishBannerKey]?: IMappedWish[]; -}; - export type IWish = { type: 'Weapon' | 'Character'; number: number; key: WeaponKey | CharacterKey; date: Date; pity: number; - banner: BannerKey; + banner: string; + bannerId: string; + rarity: number; + order: number; + isFeatured: boolean; + wonFiftyFifty: boolean; }; -export type IMappedWish = { - type: 'Weapon' | 'Character'; - number: number; - key: WeaponKey | CharacterKey; - date: Date; - pity: number; - banner: BannerKey; - name: string; - rarity: number; +export type INamedWishes = { + [key in WishBannerKey]?: INamedWish[]; }; + +export interface INamedWish extends IWish { + name: string; +} diff --git a/src/lib/utils/nav_helper.ts b/src/lib/utils/nav_helper.ts new file mode 100644 index 00000000..878586e4 --- /dev/null +++ b/src/lib/utils/nav_helper.ts @@ -0,0 +1,5 @@ +const nav = (url: string) => { + window.location.href = url; +}; + +export { nav }; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index bc354bbf..ad39c87d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -9,23 +9,42 @@ import { QueryClientProvider } from '@tanstack/svelte-query'; import { userProfile } from '$lib/store/user_profile'; import DefaultLayout from '$lib/components/layout/DefaultLayout.svelte'; - import { dataIndexStore } from '$lib/store/index_store'; + import { dataIndex } from '$lib/store/index_store'; import type { LayoutData } from '../../.svelte-kit/types/src/routes/$types'; + import { onMount } from 'svelte'; /** @type {import('../../.svelte-kit/types/src/routes/$types').LayoutData} */ export let data: LayoutData; $: webManifestLink = pwaInfo ? pwaInfo.webManifest.href : ''; - const fetchDataIndex = data.backend.data.fetchDataIndex(); - let isLoading = JSON.stringify(get(dataIndexStore).weapon) === '{}'; + const fetchCharacterDataIndex = data.backend.data.fetchCharacterDataIndex(); + const fetchWeaponDataIndex = data.backend.data.fetchWeaponDataIndex(); + let isLoading = + JSON.stringify(get(dataIndex).character) === '{}' || + JSON.stringify(get(dataIndex).weapon) === '{}'; - fetchDataIndex.subscribe((response) => { - if (response.status === 'success') { + $: { + let characterIndex = $fetchCharacterDataIndex; + let weaponIndex = $fetchWeaponDataIndex; + if (characterIndex.status === 'success' && weaponIndex.status === 'success') { + weaponIndex.data['Unknown3Star'] = { name: 'Unknown 3 star', rarity: 3, type: 'sword' }; + + dataIndex.set({ + character: characterIndex.data, + weapon: weaponIndex.data + }); isLoading = false; - response.data.weapon['Unknown3Star'] = { name: 'Unknown 3 star', rarity: 3 }; - dataIndexStore.set(response.data); } + } + + onMount(() => { + document.body.classList.add(get(applicationState).settings.theme); + + applicationState.subscribe((a) => { + document.body.classList.remove(...['light', 'dark']); + document.body.classList.add(a.settings.theme); + }); }); console.log(get(applicationState)); @@ -43,7 +62,7 @@ -
+
{#if isLoading}
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index de8c1039..7e357141 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -1,15 +1,12 @@ import BackendService from '$lib/services/backend'; import { QueryClient } from '@tanstack/svelte-query'; import { browser } from '$app/environment'; -import { io } from 'socket.io-client'; -import { applicationState } from '$lib/store/application_state'; -import { get } from 'svelte/store'; -import { toast } from 'svelte-sonner'; import { userProfile } from '$lib/store/user_profile'; -import i18n from '$lib/services/i18n'; +import { goto } from '$app/navigation'; +import { createSocketServer, socketStore } from '$lib/services/socketServer'; /** @type {import('../../.svelte-kit/types/src/routes/$types').LayoutServerLoad} */ -export async function load() { +export const load = async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { @@ -21,40 +18,25 @@ export async function load() { if (browser) { backend.user.fetchUserProfile().subscribe((response) => { - if (response.status === 'success' && response.data.state === 'SUCCESS') { - userProfile.set(response.data.data); - } - }); - - const socket = io(import.meta.env.VITE_BACKEND_URL, { withCredentials: true }); - - socket.on('authenticationState', (authenticationState: boolean) => { - applicationState.update((state) => { - state.isAuthenticated = authenticationState; - return state; - }); - }); - - socket.on('invalidateQuery', (queryKey: string[]) => { - queryClient.invalidateQueries({ queryKey }); - }); + if (response.status === 'success') { + if (response.data.state === 'NO_GENSHIN_ACCOUNTS') { + goto('/settings/firstlogin'); + } - socket.on( - 'toast', - (toastMessage: { type: 'success' | 'error' | 'info'; message: string }) => { - const message = get(i18n).t(toastMessage.message); + if (response.data.state === 'SUCCESS') { + const serverProfile = response.data.data; - switch (toastMessage.type) { - case 'success': - return toast.success(message); - case 'error': - return toast.error(message); - case 'info': - return toast.info(message); + userProfile.update((localProfile) => ({ + ...localProfile, + ...serverProfile, + lastUpdated: new Date() + })); } } - ); + }); + + createSocketServer(import.meta.env.VITE_BACKEND_URL, queryClient); } - return { queryClient, backend }; -} + return { queryClient, backend, socketStore }; +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index cfd2e8bd..d7fc6e13 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,40 +1,1164 @@ + + + + {$i18n.t('dashboard.welcome.title')} + + {$i18n.t('dashboard.welcome.message')} + + + + {$i18n.t('action.cancel')} + + + + -
- - - Changelog: - - - - Improved import (support a wider range of exports, no multi account though!!) - - Beginner's banner - - Improved pull list (added pull number, highlight 4 & 5 star, filter by dates) - - - Fixed images (no brokey anymore!!!!, huge thanks to @Flappydom for helping with - renaming files) - - Improved search experience - Characters are retrieved from user data - - Use GOOD types under the hood (You cant see it but believe me... its there) - - Character/weapon/rarity mapping - - - - - - + + + + {$i18n.t('dashboard.edit_layout.button')} + + + + + {$i18n.t('dashboard.edit_layout.title')} + + + {$i18n.t('dashboard.edit_layout.description')} + + +
+ +
+
+
+
+
+
+ {#each dragDropList as Widget} + {#if Widget.check === `${$i18n.t('dashboard.widget.changelog.title')}` && Widget.checked == true} + + + + + + {$i18n.t('dashboard.widget.changelog.title')}: + + + + + {changeLog} + + + + + + {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.reminder.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.reminder.title')} + + + + + + + {$i18n.t('dashboard.widget.reminder.daily')} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + + {$i18n.t('dashboard.widget.reminder.two_day.title')} + +
+ + +
+
+ + +
+ + + + {$i18n.t('dashboard.widget.reminder.three_day.title')} + +
+ + +
+
+ + +
+
+ + +
+ + + + {$i18n.t('dashboard.widget.reminder.weekly.title')} + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.events.title')}` && Widget.checked == true} + + + + + + {$i18n.t('dashboard.widget.events.title')} Current Events + + + + + + {$i18n.t('dashboard.widget.events.version')} + {currentVer} + +
+ +
+ {mockEvent.name} + + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 / 24 + )}d + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 + ) - + 24 * + Math.floor( + (mockEvent.end.getTime() - currentTime) / + 3600000 / + 24 + )}h + +
+
+ {mockEvent.name} + + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 / 24 + )}d + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 + ) - + 24 * + Math.floor( + (mockEvent.end.getTime() - currentTime) / + 3600000 / + 24 + )}h + +
+
+ {mockEvent.name} + + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 / 24 + )}d + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 + ) - + 24 * + Math.floor( + (mockEvent.end.getTime() - currentTime) / + 3600000 / + 24 + )}h + +
+
+ {mockEvent.name} + + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 / 24 + )}d + {Math.floor( + (mockEvent.end.getTime() - currentTime) / 3600000 + ) - + 24 * + Math.floor( + (mockEvent.end.getTime() - currentTime) / + 3600000 / + 24 + )}h + +
+
+
+ + + +
{/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.todo.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.todo.title')} + + + + + Farmable today: thing thing thing thing summary: some more even more + thing + + + {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.domain.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.domain.title')} + + + + + talent materials, weapon materials + corresponding chars/weaps + + + {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.achievements.title')}` && Widget.checked == true} + + + + + + {$i18n.t('dashboard.widget.achievements.title')} + + + + +
+ + {$i18n.t('dashboard.widget.achievements.progress')}: + + + {totalAchieved}/{totalAchievements} + +
+ +
+ + {$i18n.t('dashboard.widget.achievements.latest')}: + +
+ {#each topFiveUniqueAchievements as achievement} +
+ + + {achievement.name} + + {achievement.desc} +
+ {/each} +
+
+
+ + + + + +
{/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.pity.title')}` && Widget.checked == true} + + + + {$i18n.t('dashboard.widget.pity.title')} + + + + +
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.CharacterEvent ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.CharacterEvent ?? [] + )} + +
+
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.WeaponEvent ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.WeaponEvent ?? [] + )} + +
+
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.Standard ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.Standard ?? [] + )} + +
+
+
+
+
{/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.wishing.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.wishing.title')} + + + + + + {$i18n.t('dashboard.widget.wishing.pity')} +
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.CharacterEvent ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.CharacterEvent ?? [] + )} + +
+
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.WeaponEvent ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.WeaponEvent ?? [] + )} + +
+
+ +
+ +
+ + {calculateFiveStarPity( + $userProfile.wishes?.Standard ?? [] + )} + + + {calculateFourStarPity( + $userProfile.wishes?.Standard ?? [] + )} + +
+
+
+ +
+ + {$i18n.t('dashboard.widget.wishing.total')} + + + {($userProfile.wishes?.WeaponEvent?.length ?? 0) + + ($userProfile.wishes?.CharacterEvent?.length ?? 0) + + ($userProfile.wishes?.Beginner?.length ?? 0) + + ($userProfile.wishes?.Chronicled?.length ?? 0) + + ($userProfile.wishes?.Standard?.length ?? 0)} + +
+ +
+ + {$i18n.t('dashboard.widget.wishing.latest')} + +
+ {#each getLatestWishes($userProfile, 6) as wish} + + {/each} +
+
+
+ + + {$i18n.t('wish.overview.import_wish_button')} + + +
+ {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.display.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.display.title')} + + + +
+ + +
+ +
+
+ {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.global_wishing.title')}` && Widget.checked == true} + + + + + + {$i18n.t('dashboard.widget.global_wishing.title')} + + + + +
+
+ {currentGachaFirst.name} Gacha Card + {currentGachaFirst.name} + + {Math.round( + (currentGachaFirst.pulls / 1000 + Number.EPSILON) * 10 + ) / 10}k + + + {currentGachaFirst.percentage}% {$i18n.t( + 'dashboard.widget.global_wishing.percentage' + )} 5* + + + {$i18n.t('dashboard.widget.global_wishing.pity_average')} + {currentGachaFirst.average} + +
+
+ {currentGachaSecond.name} Gacha Card + {currentGachaSecond.name} + + {Math.round( + (currentGachaSecond.pulls / 1000 + Number.EPSILON) * 10 + ) / 10}k + + + {currentGachaSecond.percentage}% {$i18n.t( + 'dashboard.widget.global_wishing.percentage' + )} 5* + + + {$i18n.t('dashboard.widget.global_wishing.pity_average')} + {currentGachaSecond.average} + +
+
+ + {$i18n.t('dashboard.widget.global_wishing.based_on', { + number: submissions + })} + +
+ + + +
+ {/if} + {#if Widget.check === `${$i18n.t('dashboard.widget.resin.title')}` && Widget.checked == true} + + + + + {$i18n.t('dashboard.widget.resin.title')} + + + +
+ Resin Icon + + ResinCounter.HandleInput()} + />/{maxResin} + +
+
+ + + + + +
+ + {#if currentResin < maxResin} +
+ {#if currentResin < 20} + + 20 in {ResinCounter.countTimeLeft(20)} + ({ResinCounter.countEndTime(20)}) + + {/if} + {#if currentResin < 30} + + 30 in {ResinCounter.countTimeLeft(30)} + ({ResinCounter.countEndTime(30)}) + + {/if} + {#if currentResin < 40} + + 40 in {ResinCounter.countTimeLeft(40)} + ({ResinCounter.countEndTime(40)}) + + {/if} + {#if currentResin < 60} + + 60 in {ResinCounter.countTimeLeft(60)} + ({ResinCounter.countEndTime(60)}) + + {/if} + + {maxResin} in {ResinCounter.countTimeLeft(maxResin)} + ({ResinCounter.countEndTime(maxResin)}) + +
+ {/if} +
+ +
+ {/if} + {/each} +
diff --git a/src/routes/achievement/+page.svelte b/src/routes/achievement/+page.svelte new file mode 100644 index 00000000..3b18a981 --- /dev/null +++ b/src/routes/achievement/+page.svelte @@ -0,0 +1,392 @@ + + + + +
+ + {$i18n.t('achievement.show_unachived_category')} +
+
+ {#if selectedCategory} + +
+ {#each filteredAchievementsCat as [category, achievementData]} + {#if achievementData} +
+ a.achieved) + .length} + inSidebar={true} + on:click={() => handleCategoryClick(category)} + /> +
+ {/if} + {/each} +
+
+
+
+ +
+ +

{$i18n.t('achievement.unachieved')}

+
+ + {#each Object.entries(filterOptions) as [filterType, options]} + + + + {$i18n.t(`achievement.filter.${filterType}`, { + value: selectedFilters[filterType] + ? selectedFilters[filterType] + : $i18n.t('achievement.filter.all') + })} + + + + handleFilterChange(filterType, null)} + > + + {$i18n.t('achievement.filter.all')} + + {#if filterType === 'version'} + + + {#each options as majorVersion} + + {majorVersion} + + {/each} + + {#each options as majorVersion} + +
+ {#each getVersionSubmenu(majorVersion) as minorVersion} + + {/each} +
+
+ {/each} +
+ {:else} + {#each options as option} + handleFilterChange(filterType, option)} + > + + {option} + + {/each} + {/if} +
+
+ {/each} +
+
+ {#each Object.entries(dynamicBadge) as [filter, value]} + { + handleFilterChange(filter, null); + }} + > + {value} + + {/each} +
+ + +
+ {:else} +
+ {#if isLoading} +

Loading achievements...

+ {:else} +
+ {#each filteredAchievementsCat as [category, achievementData]} + {#if achievementData} +
+ a.achieved + ).length} + inSidebar={false} + on:click={() => handleCategoryClick(category)} + /> +
+ {/if} + {/each} +
+ {/if} +
+ {/if} +
+
diff --git a/src/routes/characters/+page.svelte b/src/routes/characters/+page.svelte index 349cc2e9..9b313f22 100644 --- a/src/routes/characters/+page.svelte +++ b/src/routes/characters/+page.svelte @@ -1,47 +1,52 @@ -
-
-
- -
- {$i18n.t('login.perk.cross_device_sync.title')} - - {$i18n.t('login.perk.cross_device_sync.description')} - -
-
-
- -
- {$i18n.t('login.perk.server_access.title')} - - {$i18n.t('login.perk.server_access.description')} - -
-
-
- -
- {$i18n.t('login.perk.personal_profile.title')} - - {$i18n.t('login.perk.personal_profile.description')} - +
+
+ {#each perks as perk} +
+ +
+

{$i18n.t(perk.title)}

+

{$i18n.t(perk.description)}

+
-
+ {/each}
-
- +
+ - Local data will be overwritten once you log in - Please backup your data before continuing + {$i18n.t('login.alert.title')} + {$i18n.t('login.alert.description')} - nav(backend.auth.login('google'))} - > - Google - - nav(backend.auth.login('microsoft'))} - > - Microsoft - - nav(backend.auth.login('github'))} - > - Github - + {#each loginOptions as option} + + {/each}
diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index b46927c6..d1883220 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -3,12 +3,54 @@ import Text from '$lib/components/typography/Text.svelte'; import { applicationState } from '$lib/store/application_state'; import IconButton from '$lib/components/ui/icon-button/IconButton.svelte'; - import { mdiExport, mdiImport } from '@mdi/js'; + import { + mdiAlert, + mdiContentSave, + mdiDelete, + mdiExport, + mdiImport, + mdiMicrosoft + } from '@mdi/js'; import type { Theme } from '$lib/types/theme'; import { Button } from '$lib/components/ui/button'; import DefaultLayout from '$lib/components/layout/DefaultLayout.svelte'; import i18n from '$lib/services/i18n'; import { userProfile } from '$lib/store/user_profile'; + import S3Service from '$lib/services/s3'; + import BackendService from '$lib/services/backend'; + import { siDiscord, siGithub, siGoogle, type SimpleIcon } from 'simple-icons'; + import Icon from '$lib/components/ui/icon/icon.svelte'; + import Card from '$lib/components/ui/card/card.svelte'; + import { Label } from '$lib/components/ui/label'; + import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger + } from '$lib/components/ui/dialog'; + import { nav } from '$lib/utils/nav_helper'; + import { Switch } from '$lib/components/ui/switch'; + + const backend = BackendService.getInstance(); + const createConfigMutation = backend.user.updateConfig(); + const deleteProfileMutation = backend.user.deleteUserProfile(); + + const loginOptions = [ + { name: 'Google', icon: siGoogle, action: () => nav(backend.auth.login('google')) }, + { name: 'Discord', icon: siDiscord, action: () => nav(backend.auth.login('discord')) }, + { + name: 'Microsoft', + icon: mdiMicrosoft, + action: () => nav(backend.auth.login('microsoft')) + }, + { name: 'Github', icon: siGithub, action: () => nav(backend.auth.login('github')) } + ]; + + const isSimpleIcon = (icon: string | SimpleIcon): icon is SimpleIcon => { + return typeof icon === 'object' && 'path' in icon; + }; const handleSettingsExport = () => { let element = document.createElement('a'); @@ -36,10 +78,130 @@ }; }); } + + function handleSave() { + $createConfigMutation.mutate({ + config: { ...get(userProfile).config } + }); + } + // TODO : fix this once we have image on s3 + const bgImageUrl = S3Service.getNamecard(get(userProfile).account.namecard).url; + + async function handleDelete(): Promise { + const result = await $deleteProfileMutation.mutateAsync(); + if (result.state === 'SUCCESS') { + backend.auth.logout(); + } + } -
+ + + {$i18n.t('settings.save_settings')} + + + + {#if $applicationState.isAuthenticated} +
+ +
+
+ +
+
+
+
+ {$userProfile.account.name} + UID: {$userProfile.account.uid} +
+ "{$userProfile.account.signature}" +
+
+
+ Server: + {$userProfile.account.server} +
+
+ Adventure Rank: + {$userProfile.account.ar} +
+
+ World Level: + {$userProfile.account.wl} +
+
+
+
+
+
+ Profiles + +
+
+
+ {$i18n.t('settings.login_providers')} +
+ {#each loginOptions as option} + + {option.name} + + {/each} +
+
+
+
+
+ {$i18n.t('settings.auto_refine_settings')} +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ {/if} +
{$i18n.t('settings.category.theming.title')}
+ {#if $applicationState.isAuthenticated} +
+ {$i18n.t('settings.category.data.title')} -
- {$i18n.t('settings.category.data.title')} - -
- {#if !$applicationState.isAuthenticated} +
{$i18n.t('settings.category.data.import_data_button')} - {/if} - - {$i18n.t('settings.category.data.export_data_button')} - + + + {$i18n.t('settings.category.data.export_data_button')} + +
-
+ +
+ {$i18n.t('settings.category.danger_zone.title')} + +
+ + + + Delete account + + + + +
+ + Delete account +
+
+

+ Are you sure you want to delete your account? This action is + irreversible and all data will be lost. +

+ + + +
+
+
+
+ {/if} diff --git a/src/routes/settings/firstlogin/+page.svelte b/src/routes/settings/firstlogin/+page.svelte new file mode 100644 index 00000000..2ebf614b --- /dev/null +++ b/src/routes/settings/firstlogin/+page.svelte @@ -0,0 +1,71 @@ + + + + {#if $createProfileMutation.isIdle} +
+
+

{$i18n.t('profile.complete.title')}

+

{$i18n.t('profile.complete.description')}

+
+ +
+ {/if} + + {#if $createProfileMutation.isPending} + + {$i18n.t('profile.create.pending.title')} + {$i18n.t('profile.create.pending.description')} + + {/if} + + {#if $createProfileMutation.isError} + + {$i18n.t('profile.create.error.title')} + {error} + + {/if} +
diff --git a/src/routes/settings/import/+page.svelte b/src/routes/settings/import/+page.svelte index 10cd97f2..76729117 100644 --- a/src/routes/settings/import/+page.svelte +++ b/src/routes/settings/import/+page.svelte @@ -4,7 +4,6 @@ import IconButton from '$lib/components/ui/icon-button/IconButton.svelte'; import { mdiAlert, mdiFile, mdiImport } from '@mdi/js'; import { Tabs, TabsList, TabsTrigger } from '$lib/components/ui/tabs'; - import ImporterService, { type ImporterServices } from '$lib/services/importer'; import { Button } from '$lib/components/ui/button'; import { AlertDialog, @@ -19,11 +18,11 @@ import { goto } from '$app/navigation'; import Text from '$lib/components/typography/Text.svelte'; import i18n from '$lib/services/i18n'; - import { userProfile } from '$lib/store/user_profile'; - import { applicationState } from '$lib/store/application_state'; + import BackendService from '$lib/services/backend'; - let value: ImporterServices = 'dvalin'; - const importerService = new ImporterService(); + let value: 'dvalin' | 'paimon' = 'dvalin'; + const backend = BackendService.getInstance(); + const syncUserProfile = backend.user.syncUserProfile(); let file: File | undefined = undefined; let dialogOpen = false; @@ -31,7 +30,7 @@ let element = document.createElement('input'); element.type = 'file'; element.style.display = 'none'; - element.onchange = (event) => { + element.onchange = (event: Event) => { const target = event.target as HTMLInputElement; if (target.files && target.files.length === 1) { file = target.files[0]; @@ -47,36 +46,32 @@ dialogOpen = false; if (file !== undefined) { file.text().then((fileContent) => { - try { - let data = JSON.parse(fileContent); - const importedUserProfile = importerService - .getImporterService(value) - .import(data); - - userProfile.set(importedUserProfile); - toast.success('Imported successfully!', { - description: - 'Your data has been imported successfully and stored locally in your Browser' - }); - goto('/settings'); - } catch (e) { - toast.error('An error happened!', { - description: e.message - }); - } + let data = JSON.parse(fileContent); + toast.info($i18n.t('settings.import.pending')); + $syncUserProfile.mutateAsync( + { + file: data, + format: value + }, + { + onError: (error) => { + console.error(error); + toast.error('An error occurred while importing the data'); + }, + onSuccess: () => { + toast.success($i18n.t('settings.import.success.title'), { + description: $i18n.t('settings.import.success.description') + }); + goto('/settings'); + } + } + ); }); } }; - - - Imports are temporarily disabled while being logged in - - + Dval.in diff --git a/src/routes/weapons/+page.svelte b/src/routes/weapons/+page.svelte new file mode 100644 index 00000000..dcecb3d5 --- /dev/null +++ b/src/routes/weapons/+page.svelte @@ -0,0 +1,572 @@ + + + + + + + + + + + {$i18n.t('action.sort_by', { + sortFN: $i18n.t(`sort.${$sortStore.sortFn.toLowerCase()}`) + })} + + + + setSortStore('Name')} + > + + {$i18n.t('sort.name')} + + setSortStore('Count')} + > + + {$i18n.t('sort.count')} + + setSortStore('Rarity')} + > + + {$i18n.t('sort.rarity')} + + + +
+ + + +
+
+
+ + + + + {$i18n.t('action.filter_by')} + + + + resetFilters()} + > + {$i18n.t('action.reset_filters')} + + + + {$i18n.t('filter.weapon')} + + + {#each weapons as { name, icon }} + { + setFilterStore('weapon', name); + toggleChecked(name); + }} + > + + + + + {/each} + + + + + + {$i18n.t('filter.rarity')} + + + { + setFilterStore('rarity', 5); + toggleChecked('rarity5'); + }} + > + + + + + { + setFilterStore('rarity', 4); + toggleChecked('rarity4'); + }} + > + + + + + { + setFilterStore('rarity', 3); + toggleChecked('rarity3'); + }} + > + + + + + + + + + + Ownership + + + { + setFilterStore('owned', true); + toggleChecked('owned'); + }} + class="gap-2" + > + + + + + { + setFilterStore('owned', false); + toggleChecked('notowned'); + }} + class="gap-2" + > + + + + + + + +
+ resetFilters()} + > + Reset Filters + + + +
+
+ Weapon +
+
+ {#each weapons as { name, icon }} + + {/each} +
+
+ + +
+
+ Rarity +
+
+ + + +
+
+ + +
+
+ Ownership +
+
+ + +
+
+
+
+
+
+
+ {#each $sortedWeaponStore as weapon} + + {/each} +
+
diff --git a/src/routes/weapons/[slug]/+page.svelte b/src/routes/weapons/[slug]/+page.svelte new file mode 100644 index 00000000..6ac3b345 --- /dev/null +++ b/src/routes/weapons/[slug]/+page.svelte @@ -0,0 +1,104 @@ + + + + {#if $fetchWeaponData.status === 'success'} +
+
+ + {$fetchWeaponData.data.name} +
+ + + {$fetchWeaponData.data.name} Card +
+ {#each { length: $fetchWeaponData.data.rarity } as _} + + {/each} +
+
+ +
+ + {$fetchWeaponData.data.type} + + + + {$fetchWeaponData.data.description} + + +
+
+ {$i18n.t('weapons.title.inventory')} +
+ {#each ownedWeapon as weapon} + + + {/each} +
+ {/if} +
diff --git a/src/routes/weapons/[slug]/+page.ts b/src/routes/weapons/[slug]/+page.ts new file mode 100644 index 00000000..6fd944bb --- /dev/null +++ b/src/routes/weapons/[slug]/+page.ts @@ -0,0 +1,14 @@ +import type { PageLoadEvent } from '../../weapons/[slug]/$types'; + +/** @type {import('./$types').PageLoad} */ +export async function load({ params, parent, fetch }: PageLoadEvent) { + const { queryClient, backend } = await parent(); + const key = params.slug; + + await queryClient.prefetchQuery({ + queryKey: ['fetchWeaponData', key], + queryFn: async () => (await fetch(backend.data.getWeaponDataUrl(key))).json() + }); + + return { weaponKey: key }; +} diff --git a/src/routes/wish-statistics/[slug]/+page.svelte b/src/routes/wish-statistics/[slug]/+page.svelte index 0593b534..4e49a719 100644 --- a/src/routes/wish-statistics/[slug]/+page.svelte +++ b/src/routes/wish-statistics/[slug]/+page.svelte @@ -1,58 +1,67 @@ @@ -63,36 +72,36 @@ class="bg-tertiary" title={$i18n.t('wish.detailed.info.total_pull_count')} > - {wishData.length} + {$wishData.length} - {wishData.length * 160} + {$wishData.length * 160} - {#if fiveStars.length > 0} + {#if $fiveStars.length > 0} - {((fiveStars.length / wishData.length) * 100).toFixed(1)} + {(($fiveStars.length / $wishData.length) * 100).toFixed(1)} {/if} - {#if fourStars.length > 0} + {#if $fourStars.length > 0} - {((fourStars.length / wishData.length) * 100).toFixed(1)} + {(($fourStars.length / $wishData.length) * 100).toFixed(1)} {/if} - {#if threeStars.length > 0} + {#if $threeStars.length > 0} - {((threeStars.length / wishData.length) * 100).toFixed(1)} + {(($threeStars.length / $wishData.length) * 100).toFixed(1)} {/if} - {fiveStarPity} - {fourStarPity} + {$fiveStarPity} + {$fourStarPity}
diff --git a/src/routes/wish-statistics/import/+page.svelte b/src/routes/wish-statistics/import/+page.svelte index f1d4c140..6700f9f8 100644 --- a/src/routes/wish-statistics/import/+page.svelte +++ b/src/routes/wish-statistics/import/+page.svelte @@ -22,7 +22,7 @@ const client = useQueryClient(); const fetchHoyoWishHistory = () => { - if (!wishURL.includes('e20190909gacha-v3')) { + if (!wishURL.includes('gacha_id')) { toast.error('Wrong url'); return; } @@ -80,15 +80,15 @@ Nintendo Switch - - {$i18n.t('wish.import.instructions.step1')} - + {$i18n.t('wish.import.instructions.step1')} {$i18n.t('wish.import.instructions.step2')} - - {$i18n.t('wish.import.instructions.step3')} - + {$i18n.t('wish.import.instructions.step3')} {$i18n.t('wish.import.instructions.step4')} {$i18n.t('wish.import.instructions.step5')} + {$i18n.t('wish.import.instructions.step6')} + {$i18n.t('wish.import.instructions.step7')} + {$i18n.t('wish.import.instructions.step8')} + {$i18n.t('wish.import.instructions.step9')} Use Ascent by 403f @@ -114,7 +114,7 @@