From 92baf84239fcfbd713dac52be90c341ac8042ecf Mon Sep 17 00:00:00 2001 From: cophilot Date: Mon, 22 Jul 2024 12:40:47 +0200 Subject: [PATCH] update: Mon 22 Jul 2024 12:40:47 CEST --- .github/workflows/deploy.yml | 37 + .templates/game/$$name.k$$/View.tsx | 6 + .templates/game/$$name.k$$/assets/.gitkeep | 0 .templates/game/$$name.k$$/definition.ts | 21 + .templates/game/.templify | 16 + index.html | 3 + package.json | 1 + pnpm-lock.yaml | 2067 +++++++++-------- public/vite.svg | 1 - src/App.scss | 8 +- src/App.tsx | 10 +- src/Routes.tsx | 28 + src/api/BoardScorePage/BoardScorePage.scss | 11 + src/api/BoardScorePage/BoardScorePage.tsx | 101 + src/api/BoardScoreTable/BoardScoreTable.scss | 64 + src/api/BoardScoreTable/BoardScoreTable.tsx | 197 ++ src/api/PlayerSwitch/PlayerSwitch.scss | 8 + src/api/PlayerSwitch/PlayerSwitch.tsx | 51 + src/api/utils/GameStorage.ts | 71 + src/assets/react.svg | 1 - .../BoardScorePage/BoardScorePage.scss | 2 - .../BoardScorePage/BoardScorePage.tsx | 45 - .../BoardScoreTable/BoardScoreTable.scss | 2 - .../BoardScoreTable/BoardScoreTable.tsx | 12 - src/games/dorfromatik-duel/View.tsx | 6 + src/games/dorfromatik-duel/assets/.gitkeep | 0 src/games/dorfromatik-duel/definition.ts | 21 + src/games/harmonies/View.tsx | 6 + src/games/harmonies/assets/card.png | Bin 0 -> 11240 bytes src/games/harmonies/assets/flower.png | Bin 0 -> 10625 bytes src/games/harmonies/assets/house.png | Bin 0 -> 9450 bytes src/games/harmonies/assets/leaf.png | Bin 0 -> 11013 bytes src/games/harmonies/assets/stone.png | Bin 0 -> 9353 bytes src/games/harmonies/assets/water.png | Bin 0 -> 11269 bytes src/games/harmonies/definition.ts | 57 + src/games/seven-wonders-duel/View.tsx | 6 + src/games/seven-wonders-duel/assets/.gitkeep | 0 src/games/seven-wonders-duel/definition.ts | 21 + src/index.scss | 53 +- src/utils/StringUtils.ts | 9 + src/utils/StyleUtils.ts | 24 + src/views/HomeView.tsx | 44 + 42 files changed, 2006 insertions(+), 1004 deletions(-) create mode 100644 .github/workflows/deploy.yml create mode 100644 .templates/game/$$name.k$$/View.tsx create mode 100644 .templates/game/$$name.k$$/assets/.gitkeep create mode 100644 .templates/game/$$name.k$$/definition.ts create mode 100644 .templates/game/.templify delete mode 100644 public/vite.svg create mode 100644 src/Routes.tsx create mode 100644 src/api/BoardScorePage/BoardScorePage.scss create mode 100644 src/api/BoardScorePage/BoardScorePage.tsx create mode 100644 src/api/BoardScoreTable/BoardScoreTable.scss create mode 100644 src/api/BoardScoreTable/BoardScoreTable.tsx create mode 100644 src/api/PlayerSwitch/PlayerSwitch.scss create mode 100644 src/api/PlayerSwitch/PlayerSwitch.tsx create mode 100644 src/api/utils/GameStorage.ts delete mode 100644 src/assets/react.svg delete mode 100644 src/components/BoardScorePage/BoardScorePage.scss delete mode 100644 src/components/BoardScorePage/BoardScorePage.tsx delete mode 100644 src/components/BoardScoreTable/BoardScoreTable.scss delete mode 100644 src/components/BoardScoreTable/BoardScoreTable.tsx create mode 100644 src/games/dorfromatik-duel/View.tsx create mode 100644 src/games/dorfromatik-duel/assets/.gitkeep create mode 100644 src/games/dorfromatik-duel/definition.ts create mode 100644 src/games/harmonies/View.tsx create mode 100644 src/games/harmonies/assets/card.png create mode 100644 src/games/harmonies/assets/flower.png create mode 100644 src/games/harmonies/assets/house.png create mode 100644 src/games/harmonies/assets/leaf.png create mode 100644 src/games/harmonies/assets/stone.png create mode 100644 src/games/harmonies/assets/water.png create mode 100644 src/games/harmonies/definition.ts create mode 100644 src/games/seven-wonders-duel/View.tsx create mode 100644 src/games/seven-wonders-duel/assets/.gitkeep create mode 100644 src/games/seven-wonders-duel/definition.ts create mode 100644 src/utils/StringUtils.ts create mode 100644 src/utils/StyleUtils.ts create mode 100644 src/views/HomeView.tsx diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..966be86 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,37 @@ +name: Deploy App to GitHub Pages + +on: + push: + branches: + - master + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 20 + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install dependencies + run: pnpm install + + - name: Build React app + run: pnpm run build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist + cname: board-score-hub.philipp-bonin.com diff --git a/.templates/game/$$name.k$$/View.tsx b/.templates/game/$$name.k$$/View.tsx new file mode 100644 index 0000000..188afe3 --- /dev/null +++ b/.templates/game/$$name.k$$/View.tsx @@ -0,0 +1,6 @@ +import BoardScorePage from '../../api/BoardScorePage/BoardScorePage'; +import getDefinition from './definition'; + +export default function $$name.p$$View() { + return ; +} diff --git a/.templates/game/$$name.k$$/assets/.gitkeep b/.templates/game/$$name.k$$/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.templates/game/$$name.k$$/definition.ts b/.templates/game/$$name.k$$/definition.ts new file mode 100644 index 0000000..4380a4a --- /dev/null +++ b/.templates/game/$$name.k$$/definition.ts @@ -0,0 +1,21 @@ +export default function getDefinition() { + return { + title: '$$name$$', + //bgColor: '#fff', + //fontColor: '#000', + //primaryColor: '#fff', + //secondaryColor: '#000', + playerSizes: [1, 2, 3, 4], + winMode: 'most', + rows: [ + { + name: 'Row1', + }, + + { + name: 'Row2', + icon: 'src/games/$$name.k$$/assets/test.png', + }, + ], + }; +} diff --git a/.templates/game/.templify b/.templates/game/.templify new file mode 100644 index 0000000..277ef64 --- /dev/null +++ b/.templates/game/.templify @@ -0,0 +1,16 @@ +#?: + +# This file is used by templify to generate new files from this template. + +# You can use the following variables in this file: + +# description: The description of the template + +# path: The path where the file should be generated based on the project root (you can also use placeholders here) + +# var: Define a variable placeholder that can be used in the file content + +# IMPORTANT: Lines starting with a . are auto generated and should not be changed. + +description: +path:src/games diff --git a/index.html b/index.html index 225ee4f..9a103f9 100644 --- a/index.html +++ b/index.html @@ -9,6 +9,9 @@ + BoardScoreHub diff --git a/package.json b/package.json index 31b7e19..8f156a6 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", + "react-router-dom": "^6.25.1", "sass": "^1.77.8" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef2385b..36fe40c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,616 +1,412 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - sass: - specifier: ^1.77.8 - version: 1.77.8 - -devDependencies: - '@types/react': - specifier: ^18.3.3 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@typescript-eslint/eslint-plugin': - specifier: ^7.15.0 - version: 7.16.1(@typescript-eslint/parser@7.16.1)(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/parser': - specifier: ^7.15.0 - version: 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.7.0(vite@5.3.4) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.0) - eslint-plugin-react-refresh: - specifier: ^0.4.7 - version: 0.4.8(eslint@8.57.0) - typescript: - specifier: ^5.2.2 - version: 5.5.3 - vite: - specifier: ^5.3.4 - version: 5.3.4(sass@1.77.8) +importers: + + .: + dependencies: + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.25.1 + version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sass: + specifier: ^1.77.8 + version: 1.77.8 + devDependencies: + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@typescript-eslint/eslint-plugin': + specifier: ^7.15.0 + version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': + specifier: ^7.15.0 + version: 7.16.1(eslint@8.57.0)(typescript@5.5.3) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.7.0(vite@5.3.4(sass@1.77.8)) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.7 + version: 0.4.8(eslint@8.57.0) + typescript: + specifier: ^5.2.2 + version: 5.5.3 + vite: + specifier: ^5.3.4 + version: 5.3.4(sass@1.77.8) packages: - /@esbuild/aix-ppc64@0.21.5: + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.21.5: + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.21.5: + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.21.5: + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.21.5: + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.21.5: + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.21.5: + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.21.5: + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.21.5: + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.21.5: + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.21.5: + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.21.5: + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.21.5: + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.21.5: + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.21.5: + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.21.5: + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.21.5: + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.21.5: + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.21.5: + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.21.5: + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.21.5: + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.21.5: + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.21.5: + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.11.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} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - dev: true - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.19.0: + '@remix-run/router@1.18.0': + resolution: {integrity: sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==} + engines: {node: '>=14.0.0'} + + '@rollup/rollup-android-arm-eabi@4.19.0': resolution: {integrity: sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.19.0: + '@rollup/rollup-android-arm64@4.19.0': resolution: {integrity: sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.19.0: + '@rollup/rollup-darwin-arm64@4.19.0': resolution: {integrity: sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.19.0: + '@rollup/rollup-darwin-x64@4.19.0': resolution: {integrity: sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.19.0: + '@rollup/rollup-linux-arm-gnueabihf@4.19.0': resolution: {integrity: sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.19.0: + '@rollup/rollup-linux-arm-musleabihf@4.19.0': resolution: {integrity: sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.19.0: + '@rollup/rollup-linux-arm64-gnu@4.19.0': resolution: {integrity: sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.19.0: + '@rollup/rollup-linux-arm64-musl@4.19.0': resolution: {integrity: sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.19.0: + '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': resolution: {integrity: sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.19.0: + '@rollup/rollup-linux-riscv64-gnu@4.19.0': resolution: {integrity: sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.19.0: + '@rollup/rollup-linux-s390x-gnu@4.19.0': resolution: {integrity: sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.19.0: + '@rollup/rollup-linux-x64-gnu@4.19.0': resolution: {integrity: sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.19.0: + '@rollup/rollup-linux-x64-musl@4.19.0': resolution: {integrity: sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.19.0: + '@rollup/rollup-win32-arm64-msvc@4.19.0': resolution: {integrity: sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.19.0: + '@rollup/rollup-win32-ia32-msvc@4.19.0': resolution: {integrity: sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.19.0: + '@rollup/rollup-win32-x64-msvc@4.19.0': resolution: {integrity: sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@swc/core-darwin-arm64@1.7.0: + '@swc/core-darwin-arm64@1.7.0': resolution: {integrity: sha512-2ylhM7f0HwUwLrFYZAe/dse8PCbPsYcJS3Dt7Q8NT3PUn7vy6QOMxNcOPPuDrnmaXqQQO3oxdmRapguTxaat9g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@swc/core-darwin-x64@1.7.0: + '@swc/core-darwin-x64@1.7.0': resolution: {integrity: sha512-SgVnN4gT1Rb9YfTkp4FCUITqSs7Yj0uB2SUciu5CV3HuGvS5YXCUzh+KrwpLFtx8NIgivISKcNnb41mJi98X8Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@swc/core-linux-arm-gnueabihf@1.7.0: + '@swc/core-linux-arm-gnueabihf@1.7.0': resolution: {integrity: sha512-+Z9Dayart1iKJQEJJ9N/KS4z5EdXJE3WPFikY0jonKTo4Dd8RuyVz5yLvqcIMeVdz/SwximATaL6iJXw7hZS9A==} engines: {node: '>=10'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@swc/core-linux-arm64-gnu@1.7.0: + '@swc/core-linux-arm64-gnu@1.7.0': resolution: {integrity: sha512-UnLrCiZ1EI4shznJn0xP6DLgsXUSwtfsdgHhGYCrvbgVBBve3S9iFgVFEB3SPl7Q/TdowNbrN4zHU0oChfiNfw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@swc/core-linux-arm64-musl@1.7.0: + '@swc/core-linux-arm64-musl@1.7.0': resolution: {integrity: sha512-H724UANA+ptsfwKRr9mnaDa9cb5fw0oFysiGKTgb3DMYcgk3Od0jMTnXVPFSVpo7FlmyxeC9K8ueUPBOoOK6XA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@swc/core-linux-x64-gnu@1.7.0: + '@swc/core-linux-x64-gnu@1.7.0': resolution: {integrity: sha512-SY3HA0K0Dpqt1HIfMLGpwL4hd4UaL2xHP5oZXPlRQPhUDZrbb4PbI3ZJnh66c63eL4ZR8EJ+HRFI0Alx5p69Zw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@swc/core-linux-x64-musl@1.7.0: + '@swc/core-linux-x64-musl@1.7.0': resolution: {integrity: sha512-cEJ2ebtV1v/5Ilb55E05J6F5SrHKQWzUttIhR5Mkayyo+yvPslcpByuFC3D+J7X1ebziTOBpWuMpUdjLfh3SMQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@swc/core-win32-arm64-msvc@1.7.0: + '@swc/core-win32-arm64-msvc@1.7.0': resolution: {integrity: sha512-ecQOOmzEssz+m0pR4xDYCGuvn3E/l0nQ3tk5jp1NA1lsAy4bMV0YbYCHjptYvWL/UjhIerIp3IlCJ8x5DodSog==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@swc/core-win32-ia32-msvc@1.7.0: + '@swc/core-win32-ia32-msvc@1.7.0': resolution: {integrity: sha512-gz81seZkRn3zMnVOc7L5k6F4vQC82gIxmHiL+GedK+A37XI/X26AASU3zxvORnqQbwQYXQ+AEVckxBmFlz3v2g==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@swc/core-win32-x64-msvc@1.7.0: + '@swc/core-win32-x64-msvc@1.7.0': resolution: {integrity: sha512-b5Fd1xEOw9uqBpj2lqsaR4Iq9UhiL84hNDcEsi6DQA7Y1l85waQAslTbS0E4/pJ1PISAs0jW0zIGLco1eaWBOg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@swc/core@1.7.0: + '@swc/core@1.7.0': resolution: {integrity: sha512-d4vMzH6ICllDwlPuhset2h8gu/USHdbyfJim+2hQEdxC0UONtfpmu38XBgNqRjStrji1Q5M10jfeUZL3cu1i8g==} engines: {node: '>=10'} - requiresBuild: true peerDependencies: '@swc/helpers': '*' peerDependenciesMeta: '@swc/helpers': optional: true - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.10 - optionalDependencies: - '@swc/core-darwin-arm64': 1.7.0 - '@swc/core-darwin-x64': 1.7.0 - '@swc/core-linux-arm-gnueabihf': 1.7.0 - '@swc/core-linux-arm64-gnu': 1.7.0 - '@swc/core-linux-arm64-musl': 1.7.0 - '@swc/core-linux-x64-gnu': 1.7.0 - '@swc/core-linux-x64-musl': 1.7.0 - '@swc/core-win32-arm64-msvc': 1.7.0 - '@swc/core-win32-ia32-msvc': 1.7.0 - '@swc/core-win32-x64-msvc': 1.7.0 - dev: true - /@swc/counter@0.1.3: + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: true - /@swc/types@0.1.10: + '@swc/types@0.1.10': resolution: {integrity: sha512-jIar7JjM8pwwOo/IpOmR1aYOAZmXKwyk0qhl5jbIMReAocmBCcyGaTWVemDbsJ6zNrcFE+d7Vy3aNWx6z7CIbw==} - dependencies: - '@swc/counter': 0.1.3 - dev: true - /@types/estree@1.0.5: + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/prop-types@15.7.12: + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: true - /@types/react-dom@18.3.0: + '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - dependencies: - '@types/react': 18.3.3 - dev: true - /@types/react@18.3.3: + '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - dev: true - /@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1)(eslint@8.57.0)(typescript@5.5.3): + '@typescript-eslint/eslint-plugin@7.16.1': resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -620,24 +416,8 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3): + '@typescript-eslint/parser@7.16.1': resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -646,27 +426,12 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.5 - eslint: 8.57.0 - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/scope-manager@7.16.1: + '@typescript-eslint/scope-manager@7.16.1': resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - dev: true - /@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.3): + '@typescript-eslint/type-utils@7.16.1': resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -675,23 +440,12 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/types@7.16.1: + '@typescript-eslint/types@7.16.1': resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} engines: {node: ^18.18.0 || >=20.0.0} - dev: true - /@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3): + '@typescript-eslint/typescript-estree@7.16.1': resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -699,193 +453,104 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.3): + '@typescript-eslint/utils@7.16.1': resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/visitor-keys@7.16.1: + '@typescript-eslint/visitor-keys@7.16.1': resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.16.1 - eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - /@vitejs/plugin-react-swc@3.7.0(vite@5.3.4): + '@vitejs/plugin-react-swc@3.7.0': resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} peerDependencies: vite: ^4 || ^5 - dependencies: - '@swc/core': 1.7.0 - vite: 5.3.4(sass@1.77.8) - transitivePeerDependencies: - - '@swc/helpers' - dev: true - /acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.12.1 - dev: true - /acorn@8.12.1: + acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /ajv@6.12.6: + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - /anymatch@3.1.3: + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /array-union@2.1.0: + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - /binary-extensions@2.3.0: + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - /brace-expansion@1.1.11: + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - /braces@3.0.3: + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - /callsites@3.1.0: + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true - /chalk@4.1.2: + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chokidar@3.6.0: + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - /color-convert@2.0.1: + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - /color-name@1.1.4: + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - /concat-map@0.0.1: + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - /cross-spawn@7.0.3: + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /csstype@3.1.3: + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true - /debug@4.3.5: + debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: @@ -893,730 +558,425 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - /deep-is@0.1.4: + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /dir-glob@3.0.1: + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - /doctrine@3.0.0: + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - /esbuild@0.21.5: + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - dev: true - /escape-string-regexp@4.0.0: + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.57.0 - dev: true - /eslint-plugin-react-refresh@0.4.8(eslint@8.57.0): + eslint-plugin-react-refresh@0.4.8: resolution: {integrity: sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==} peerDependencies: eslint: '>=7' - dependencies: - eslint: 8.57.0 - dev: true - /eslint-scope@7.2.2: + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: + 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} - dev: true - /eslint@8.57.0: + eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - 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.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /espree@9.6.1: + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - dev: true - /esquery@1.6.0: + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true - /esutils@2.0.3: + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true - /fast-deep-equal@3.1.3: + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - /fast-glob@3.3.2: + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - dev: true - /fast-json-stable-stringify@2.1.0: + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - /fast-levenshtein@2.0.6: + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - /fastq@1.17.1: + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 - dev: true - /file-entry-cache@6.0.1: + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - /fill-range@7.1.1: + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - /find-up@5.0.0: + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - /flatted@3.3.1: + flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true - /fs.realpath@1.0.0: + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - optional: true - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - /glob-parent@6.0.2: + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@7.2.3: + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /globals@13.24.0: + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - /globby@11.1.0: + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - 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 - dev: true - /graphemer@1.4.0: + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - /has-flag@4.0.0: + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true - /ignore@5.3.1: + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - dev: true - /immutable@4.3.6: + immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} - /import-fresh@3.3.0: + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - /imurmurhash@0.1.4: + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - dev: true - /inflight@1.0.6: + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - /inherits@2.0.4: + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - /is-binary-path@2.1.0: + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dependencies: - binary-extensions: 2.3.0 - /is-extglob@2.1.1: + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-glob@4.0.3: + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - /is-number@7.0.0: + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-path-inside@3.0.3: + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - dev: true - /isexe@2.0.0: + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - /js-tokens@4.0.0: + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - /js-yaml@4.1.0: + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - /json-buffer@3.0.1: + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - /json-schema-traverse@0.4.1: + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /json-stable-stringify-without-jsonify@1.0.1: + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - /keyv@4.5.4: + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - /levn@0.4.1: + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - /locate-path@6.0.0: + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.merge@4.6.2: + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - /loose-envify@1.4.0: + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - /merge2@1.4.1: + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: true - /micromatch@4.0.7: + micromatch@4.0.7: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: true - /minimatch@3.1.2: + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.5: + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /ms@2.1.2: + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - /nanoid@3.3.7: + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true - /natural-compare@1.4.0: + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - /normalize-path@3.0.0: + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /once@1.4.0: + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - /optionator@0.9.4: + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - /p-limit@3.1.0: + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - /p-locate@5.0.0: + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - /parent-module@1.0.1: + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - /path-exists@4.0.0: + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true - /path-is-absolute@1.0.1: + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true - /path-key@3.1.1: + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true - /path-type@4.0.0: + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true - /picocolors@1.0.1: + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true - /picomatch@2.3.1: + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /postcss@8.4.39: + postcss@8.4.39: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true - /prelude-ls@1.2.1: + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true - /punycode@2.3.1: + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: true - /queue-microtask@1.2.3: + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - /react-dom@18.3.1(react@18.3.1): + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: react: ^18.3.1 - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - dev: false - /react@18.3.1: + react-router-dom@6.25.1: + resolution: {integrity: sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.25.1: + resolution: {integrity: sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - /readdirp@3.6.0: + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - /resolve-from@4.0.0: + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true - /reusify@1.0.4: + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - /rimraf@3.0.2: + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rollup@4.19.0: + rollup@4.19.0: resolution: {integrity: sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.19.0 - '@rollup/rollup-android-arm64': 4.19.0 - '@rollup/rollup-darwin-arm64': 4.19.0 - '@rollup/rollup-darwin-x64': 4.19.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.19.0 - '@rollup/rollup-linux-arm-musleabihf': 4.19.0 - '@rollup/rollup-linux-arm64-gnu': 4.19.0 - '@rollup/rollup-linux-arm64-musl': 4.19.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.19.0 - '@rollup/rollup-linux-riscv64-gnu': 4.19.0 - '@rollup/rollup-linux-s390x-gnu': 4.19.0 - '@rollup/rollup-linux-x64-gnu': 4.19.0 - '@rollup/rollup-linux-x64-musl': 4.19.0 - '@rollup/rollup-win32-arm64-msvc': 4.19.0 - '@rollup/rollup-win32-ia32-msvc': 4.19.0 - '@rollup/rollup-win32-x64-msvc': 4.19.0 - fsevents: 2.3.3 - dev: true - /run-parallel@1.2.0: + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - /sass@1.77.8: + sass@1.77.8: resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} engines: {node: '>=14.0.0'} hasBin: true - dependencies: - chokidar: 3.6.0 - immutable: 4.3.6 - source-map-js: 1.2.0 - /scheduler@0.23.2: + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - dependencies: - loose-envify: 1.4.0 - dev: false - /semver@7.6.3: + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - dev: true - /shebang-command@2.0.0: + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true - /slash@3.0.0: + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true - /source-map-js@1.2.0: + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - /strip-ansi@6.0.1: + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - /strip-json-comments@3.1.1: + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true - /supports-color@7.2.0: + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - /text-table@0.2.0: + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - /to-regex-range@5.0.1: + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - /ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - dependencies: - typescript: 5.5.3 - dev: true - /type-check@0.4.0: + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - /type-fest@0.20.2: + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - dev: true - /typescript@5.5.3: + typescript@5.5.3: resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true - dev: true - /uri-js@4.4.1: + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - /vite@5.3.4(sass@1.77.8): + vite@5.3.4: resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -1643,33 +1003,888 @@ packages: optional: true terser: optional: true - dependencies: - esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.19.0 - sass: 1.77.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /which@2.0.2: + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /word-wrap@1.2.5: + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - dev: true - /wrappy@1.0.2: + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - /yocto-queue@0.1.0: + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: true + +snapshots: + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@remix-run/router@1.18.0': {} + + '@rollup/rollup-android-arm-eabi@4.19.0': + optional: true + + '@rollup/rollup-android-arm64@4.19.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.19.0': + optional: true + + '@rollup/rollup-darwin-x64@4.19.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.19.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.19.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.19.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.19.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.19.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.19.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.19.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.19.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.19.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.19.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.19.0': + optional: true + + '@swc/core-darwin-arm64@1.7.0': + optional: true + + '@swc/core-darwin-x64@1.7.0': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.0': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.0': + optional: true + + '@swc/core-linux-arm64-musl@1.7.0': + optional: true + + '@swc/core-linux-x64-gnu@1.7.0': + optional: true + + '@swc/core-linux-x64-musl@1.7.0': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.0': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.0': + optional: true + + '@swc/core-win32-x64-msvc@1.7.0': + optional: true + + '@swc/core@1.7.0': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.10 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.0 + '@swc/core-darwin-x64': 1.7.0 + '@swc/core-linux-arm-gnueabihf': 1.7.0 + '@swc/core-linux-arm64-gnu': 1.7.0 + '@swc/core-linux-arm64-musl': 1.7.0 + '@swc/core-linux-x64-gnu': 1.7.0 + '@swc/core-linux-x64-musl': 1.7.0 + '@swc/core-win32-arm64-msvc': 1.7.0 + '@swc/core-win32-ia32-msvc': 1.7.0 + '@swc/core-win32-x64-msvc': 1.7.0 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.10': + dependencies: + '@swc/counter': 0.1.3 + + '@types/estree@1.0.5': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.1 + '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.1 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.16.1 + '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.1 + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.16.1': + dependencies: + '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/visitor-keys': 7.16.1 + + '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) + debug: 4.3.5 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.16.1': {} + + '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/visitor-keys': 7.16.1 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.16.1 + '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.16.1': + dependencies: + '@typescript-eslint/types': 7.16.1 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react-swc@3.7.0(vite@5.3.4(sass@1.77.8))': + dependencies: + '@swc/core': 1.7.0 + vite: 5.3.4(sass@1.77.8) + transitivePeerDependencies: + - '@swc/helpers' + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.4.8(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + 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 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + ignore@5.3.1: {} + + immutable@4.3.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + normalize-path@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.39: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-router-dom@6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.18.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.25.1(react@18.3.1) + + react-router@6.25.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.18.0 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.19.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.19.0 + '@rollup/rollup-android-arm64': 4.19.0 + '@rollup/rollup-darwin-arm64': 4.19.0 + '@rollup/rollup-darwin-x64': 4.19.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.19.0 + '@rollup/rollup-linux-arm-musleabihf': 4.19.0 + '@rollup/rollup-linux-arm64-gnu': 4.19.0 + '@rollup/rollup-linux-arm64-musl': 4.19.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.19.0 + '@rollup/rollup-linux-riscv64-gnu': 4.19.0 + '@rollup/rollup-linux-s390x-gnu': 4.19.0 + '@rollup/rollup-linux-x64-gnu': 4.19.0 + '@rollup/rollup-linux-x64-musl': 4.19.0 + '@rollup/rollup-win32-arm64-msvc': 4.19.0 + '@rollup/rollup-win32-ia32-msvc': 4.19.0 + '@rollup/rollup-win32-x64-msvc': 4.19.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sass@1.77.8: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + text-table@0.2.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.3.0(typescript@5.5.3): + dependencies: + typescript: 5.5.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.5.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@5.3.4(sass@1.77.8): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.19.0 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.77.8 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yocto-queue@0.1.0: {} diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/App.scss b/src/App.scss index 1262279..1c89275 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,6 +1,8 @@ #root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; text-align: center; } diff --git a/src/App.tsx b/src/App.tsx index 397e19e..5ea2849 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,16 +1,10 @@ import './App.scss'; -import BoardScorePage from './components/BoardScorePage/BoardScorePage'; +import Routes from './Routes'; function App() { return ( <> - + ); } diff --git a/src/Routes.tsx b/src/Routes.tsx new file mode 100644 index 0000000..b736c42 --- /dev/null +++ b/src/Routes.tsx @@ -0,0 +1,28 @@ +import { Route, Routes as ReactRoutes, HashRouter } from 'react-router-dom'; +import HomeView from './views/HomeView'; +import HarmoniesView from './games/harmonies/View'; +import SevenWondersDuelView from './games/seven-wonders-duel/View'; +import DorfromatikDuelView from './games/dorfromatik-duel/View'; +function Routes() { + return ( + <> + + + + + + + + + + + ); +} + +export default Routes; diff --git a/src/api/BoardScorePage/BoardScorePage.scss b/src/api/BoardScorePage/BoardScorePage.scss new file mode 100644 index 0000000..946fefb --- /dev/null +++ b/src/api/BoardScorePage/BoardScorePage.scss @@ -0,0 +1,11 @@ +.board-score-page { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 50px; + .nav-btn { + margin-top: 20px; + min-width: 150px; + } +} diff --git a/src/api/BoardScorePage/BoardScorePage.tsx b/src/api/BoardScorePage/BoardScorePage.tsx new file mode 100644 index 0000000..f8ff07b --- /dev/null +++ b/src/api/BoardScorePage/BoardScorePage.tsx @@ -0,0 +1,101 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import './BoardScorePage.scss'; +import { useEffect, useState } from 'react'; +import PlayerSwitch from '../PlayerSwitch/PlayerSwitch'; +import StyleUtils from '../../utils/StyleUtils'; +import BoardScoreTable from '../BoardScoreTable/BoardScoreTable'; +import GameStorage from '../utils/GameStorage'; +import { useNavigate } from 'react-router-dom'; + +interface BoardScoreTableProps { + definition: any; +} + +/** + * This is a BoardScorePage component + * @author cophilot + * @version 1.0.0 + * @created 2024-7-21 + */ +function BoardScorePage({ definition }: BoardScoreTableProps): JSX.Element { + const navigate = useNavigate(); + const [playerSize, setPlayerSize] = useState( + GameStorage.getPlayerSize(definition.title, definition.playerSizes[0]) + ); + + const onPlayerSizeChange = (size: number) => { + setPlayerSize(size); + GameStorage.setPlayerSize(definition.title, size); + }; + + useEffect(() => { + setInitialAttributes(definition); + }, [definition]); + + return ( +
+ {definition.title &&

{definition.title}

} + + + + + +
+ ); +} +export default BoardScorePage; + +function setInitialAttributes(definition: any) { + setAttributeIfPresent(definition.title, (title) => { + document.title = title + ' - BoardScoreHub'; + }); + setAttributeIfPresent( + definition.bgColor, + StyleUtils.setBackGroundColor, + true + ); + setAttributeIfPresent(definition.fontColor, StyleUtils.setFontColor, true); + setAttributeIfPresent( + definition.primaryColor, + StyleUtils.setPrimaryColor, + true + ); + setAttributeIfPresent( + definition.secondaryColor, + StyleUtils.setSecondaryColor, + true + ); +} + +function setAttributeIfPresent( + attribute: unknown, + callback: (arg0?: any) => void, + callWithDefaultAttribute = false +) { + if (attribute !== undefined && attribute !== null) { + callback(attribute); + return; + } + + if (callWithDefaultAttribute) { + callback(); + } +} diff --git a/src/api/BoardScoreTable/BoardScoreTable.scss b/src/api/BoardScoreTable/BoardScoreTable.scss new file mode 100644 index 0000000..c1cebf2 --- /dev/null +++ b/src/api/BoardScoreTable/BoardScoreTable.scss @@ -0,0 +1,64 @@ +.board-score-table { + width: 100%; + max-width: 800px; + border-collapse: collapse; + border-spacing: 0; + margin: 20px 20px; + font-size: 20px; + line-height: 1; + + th { + font-weight: bold; + background-color: var(--primary-color); + color: var(--bg-color); + position: sticky; + top: -3px; + } + + th, + td { + border: 3px solid var(--primary-color); + padding: 20px; + height: 50px; + } + input { + font-size: 30px; + height: 50px; + max-width: 50px; + } + .row-icon { + height: 70px; + } + .total-row { + background-color: var(--secondary-color); + color: var(--primary-color); + font-weight: bold; + } + .win { + background-color: var(--primary-color); + color: var(--bg-color); + } +} + +@media (max-width: 600px) { + .board-score-table { + font-size: 16px; + width: 95%; + th, + td { + padding: 2px; + } + .row-icon { + height: 50px; + } + input { + font-size: 16px; + max-width: 30px; + } + th { + input { + font-size: 16px; + } + } + } +} diff --git a/src/api/BoardScoreTable/BoardScoreTable.tsx b/src/api/BoardScoreTable/BoardScoreTable.tsx new file mode 100644 index 0000000..7ce9809 --- /dev/null +++ b/src/api/BoardScoreTable/BoardScoreTable.tsx @@ -0,0 +1,197 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { useEffect, useState } from 'react'; +import './BoardScoreTable.scss'; +import GameStorage from '../utils/GameStorage'; + +interface BoardScoreTableProps { + definition: any; + playerSize: number; +} + +/** + * This is a BoardScoreTable component + * @author cophilot + * @version 1.0.0 + * @created 2024-7-21 + */ +function BoardScoreTable({ definition, playerSize }: BoardScoreTableProps) { + const playerSizes = Array.from(Array(playerSize).keys()); + const rows = definition.rows || []; + + const [tableMatrix, setTableMatrix] = useState( + GameStorage.getGameMatrix( + definition.title, + getEmptyTbaleMatrix(rows.length, playerSize) + ) + ); + const [totalRow, setTotalRow] = useState( + Array.from(Array(playerSize).keys()).map(() => 0) + ); + const [playerNames, setPlayerNames] = useState( + GameStorage.getPlayerNames(definition.title, []) + ); + + useEffect(() => { + const newTotalRow = Array.from(Array(playerSize).keys()).map( + (playerIndex) => getColumnTotal(playerIndex) + ); + setTotalRow(newTotalRow); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [playerSize, tableMatrix]); + + const getTableValue = (rowIndex: number, playerIndex: number) => { + return tableMatrix[rowIndex][playerIndex]; + }; + + const setTableValue = ( + rowIndex: number, + playerIndex: number, + value: any + ) => { + // return if value is not a number + if (isNaN(value)) { + return; + } + const newTableMatrix = tableMatrix.map( + (row: number[], index: number) => { + if (index === rowIndex) { + row[playerIndex] = Number(value); + } + return row; + } + ); + setTableMatrix(newTableMatrix); + GameStorage.setGameMatrix(definition.title, newTableMatrix); + }; + + const getColumnTotal = (playerIndex: number) => { + return tableMatrix.reduce((acc: number, row: number[]) => { + if (isNaN(row[playerIndex])) { + return acc; + } + return acc + row[playerIndex]; + }, 0); + }; + + const getWinningScore = () => { + const winMode = definition.winMode || 'most'; + const winFn = winMode === 'most' ? Math.max : Math.min; + const value = winFn(...totalRow); + // check if all values are the same + if (totalRow.every((val) => val === value)) { + return null; + } + return value; + }; + + return ( + + + + + {playerSizes.map((index) => ( + + ))} + + + + {rows.map((row: any, index: number) => ( + + + {playerSizes.map((playerIndex) => ( + + ))} + + ))} + + + {totalRow.map((value, playerIndex) => ( + + ))} + + +
+ { + const newPlayerNames = playerNames.slice(); + newPlayerNames[index] = e.target.value; + setPlayerNames(newPlayerNames); + GameStorage.setPlayerNames( + definition.title, + newPlayerNames + ); + }} + /> +
+ {isNaN(value) ? 0 : value} +
+ ); +} +export default BoardScoreTable; + +type InputCellProps = { + rowIndex: number; + playerIndex: number; + getValueFunction: (rowIndex: number, playerIndex: number) => any; + setValueFunction: ( + rowIndex: number, + playerIndex: number, + value: any + ) => void; +}; + +function InputCell({ + rowIndex, + playerIndex, + getValueFunction, + setValueFunction, +}: InputCellProps) { + let value = getValueFunction(rowIndex, playerIndex); + if (value === 0) { + value = ''; + } + + return ( + + + setValueFunction(rowIndex, playerIndex, e.target.value) + } + value={value} + /> + + ); +} + +type FirstRowCellProps = { + row: any; +}; + +function FirstRowCell({ row }: FirstRowCellProps) { + let inner = row.name; + if (row.icon) { + inner = {row.name}; + } + return {inner}; +} + +function getEmptyTbaleMatrix(rows: number, cols: number) { + return Array.from(Array(rows).keys()).map(() => + Array.from(Array(cols).keys()).map(() => 0) + ); +} diff --git a/src/api/PlayerSwitch/PlayerSwitch.scss b/src/api/PlayerSwitch/PlayerSwitch.scss new file mode 100644 index 0000000..3c74d6c --- /dev/null +++ b/src/api/PlayerSwitch/PlayerSwitch.scss @@ -0,0 +1,8 @@ +.player-switch { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + // max 4 buttons per row + max-width: 350px; +} diff --git a/src/api/PlayerSwitch/PlayerSwitch.tsx b/src/api/PlayerSwitch/PlayerSwitch.tsx new file mode 100644 index 0000000..bd1f82b --- /dev/null +++ b/src/api/PlayerSwitch/PlayerSwitch.tsx @@ -0,0 +1,51 @@ +import { useState } from 'react'; +import './PlayerSwitch.scss'; + +interface PlayerSwitchProps { + playerSizes?: number[]; + initPlayerSize?: number; + onPlayerSizeChange: (size: number) => void; +} + +/** + * This is a PlayerSwitch component + * @author cophilot + * @version 1.0.0 + * @created 2024-7-21 + */ +function PlayerSwitch({ + playerSizes, + initPlayerSize, + onPlayerSizeChange, +}: PlayerSwitchProps) { + const minPlayerSize = playerSizes && Math.min(...playerSizes); + const [currentPlayerSize, setCurrentPlayerSize] = useState( + initPlayerSize || minPlayerSize + ); + if (!playerSizes || playerSizes.length <= 1) { + return null; + } + + return ( + <> +

Players

+
+ {playerSizes.map((size) => ( + + ))} +
+ + ); +} +export default PlayerSwitch; diff --git a/src/api/utils/GameStorage.ts b/src/api/utils/GameStorage.ts new file mode 100644 index 0000000..14f6de1 --- /dev/null +++ b/src/api/utils/GameStorage.ts @@ -0,0 +1,71 @@ +export default class GameStorage { + static getStorageKeyFromTitle(gameTitle: string, subKey: string = '') { + let key = gameTitle.toLowerCase() + '-storage'; + if (subKey !== '') { + key += '-' + subKey.toLowerCase(); + } + return key; + } + + static deleteStorage(gameTitle: string) { + // get all keys + const keys = Object.keys(localStorage); + // filter keys that match the game title + const gameKeys = keys.filter((key) => + key.includes(gameTitle.toLowerCase()) + ); + // delete all keys + gameKeys.forEach((key) => localStorage.removeItem(key)); + } + + static getPlayerNames(gameTitle: string, fallback: string[] = []) { + const playerNames = localStorage.getItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'player-names') + ); + if (playerNames === null) { + return fallback; + } + return JSON.parse(playerNames); + } + + static setPlayerNames(gameTitle: string, playerNames: string[]) { + localStorage.setItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'player-names'), + JSON.stringify(playerNames) + ); + } + + static getPlayerSize(gameTitle: string, fallback: number = 2) { + const playerSize = localStorage.getItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'player-size') + ); + if (playerSize === null) { + return fallback; + } + return parseInt(playerSize); + } + + static setPlayerSize(gameTitle: string, playerSize: number) { + localStorage.setItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'player-size'), + playerSize.toString() + ); + } + + static getGameMatrix(gameTitle: string, fallback: number[][] = []) { + const matrix = localStorage.getItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'matrix') + ); + if (matrix === null) { + return fallback; + } + return JSON.parse(matrix); + } + + static setGameMatrix(gameTitle: string, matrix: number[][]) { + localStorage.setItem( + GameStorage.getStorageKeyFromTitle(gameTitle, 'matrix'), + JSON.stringify(matrix) + ); + } +} diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/BoardScorePage/BoardScorePage.scss b/src/components/BoardScorePage/BoardScorePage.scss deleted file mode 100644 index 1896f15..0000000 --- a/src/components/BoardScorePage/BoardScorePage.scss +++ /dev/null @@ -1,2 +0,0 @@ -.board-score-page { -} \ No newline at end of file diff --git a/src/components/BoardScorePage/BoardScorePage.tsx b/src/components/BoardScorePage/BoardScorePage.tsx deleted file mode 100644 index ae5dd2c..0000000 --- a/src/components/BoardScorePage/BoardScorePage.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import './BoardScorePage.scss'; -import BoardScoreTable from '../BoardScoreTable/BoardScoreTable'; -import { useEffect } from 'react'; - -interface BoardScoreTableProps { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - definition: any; -} - -/** - * This is a BoardScorePage component - * @author cophilot - * @version 1.0.0 - * @created 2024-7-21 - */ -function BoardScorePage({ definition }: BoardScoreTableProps): JSX.Element { - useEffect(() => { - // initialize global page attributes - setAttributeIfPresent(definition.pageTitle, (title) => { - document.title = title; - }); - setAttributeIfPresent(definition.bgColor, (bgColor) => { - document.body.style.backgroundColor = bgColor; - }); - }, [definition.bgColor, definition.pageTitle]); - - return ( -
- {definition.title &&

{definition.title}

} -
- ); -} -export default BoardScorePage; - -function setAttributeIfPresent( - attribute: unknown, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - callback: (arg0: any) => void -) { - if (attribute !== undefined && attribute !== null) { - callback(attribute); - } -} diff --git a/src/components/BoardScoreTable/BoardScoreTable.scss b/src/components/BoardScoreTable/BoardScoreTable.scss deleted file mode 100644 index 19c1a82..0000000 --- a/src/components/BoardScoreTable/BoardScoreTable.scss +++ /dev/null @@ -1,2 +0,0 @@ -.board-score-table { -} \ No newline at end of file diff --git a/src/components/BoardScoreTable/BoardScoreTable.tsx b/src/components/BoardScoreTable/BoardScoreTable.tsx deleted file mode 100644 index 087c064..0000000 --- a/src/components/BoardScoreTable/BoardScoreTable.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import './BoardScoreTable.scss'; - -/** - * This is a BoardScoreTable component - * @author cophilot - * @version 1.0.0 - * @created 2024-7-21 - */ -function BoardScoreTable() { - return
Hello from BoardScoreTable
; -} -export default BoardScoreTable; \ No newline at end of file diff --git a/src/games/dorfromatik-duel/View.tsx b/src/games/dorfromatik-duel/View.tsx new file mode 100644 index 0000000..6fc1d84 --- /dev/null +++ b/src/games/dorfromatik-duel/View.tsx @@ -0,0 +1,6 @@ +import BoardScorePage from '../../api/BoardScorePage/BoardScorePage'; +import getDefinition from './definition'; + +export default function DorfromatikDuelView() { + return ; +} diff --git a/src/games/dorfromatik-duel/assets/.gitkeep b/src/games/dorfromatik-duel/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/games/dorfromatik-duel/definition.ts b/src/games/dorfromatik-duel/definition.ts new file mode 100644 index 0000000..d0ae2f1 --- /dev/null +++ b/src/games/dorfromatik-duel/definition.ts @@ -0,0 +1,21 @@ +export default function getDefinition() { + return { + title: 'Dorfromatik: Duel', + //bgColor: '#fff', + //fontColor: '#000', + //primaryColor: '#fff', + //secondaryColor: '#000', + playerSizes: [2], + winMode: 'most', + rows: [ + { + name: 'Row1', + }, + + { + name: 'Row2', + icon: 'src/games/dorfromatik-duel/assets/test.png', + }, + ], + }; +} diff --git a/src/games/harmonies/View.tsx b/src/games/harmonies/View.tsx new file mode 100644 index 0000000..51c47b6 --- /dev/null +++ b/src/games/harmonies/View.tsx @@ -0,0 +1,6 @@ +import BoardScorePage from '../../api/BoardScorePage/BoardScorePage'; +import getDefinition from './definition'; + +export default function HarmoniesView() { + return ; +} diff --git a/src/games/harmonies/assets/card.png b/src/games/harmonies/assets/card.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cdfdc721c6c18bd56c69e451c0d05d6cb4e47d GIT binary patch literal 11240 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 OhbSkd46c$e4f%h}&|5PA literal 0 HcmV?d00001 diff --git a/src/games/harmonies/assets/house.png b/src/games/harmonies/assets/house.png new file mode 100644 index 0000000000000000000000000000000000000000..55ffdda00713d46f135f6f4bcaf33d39ca672fda GIT binary patch literal 9450 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%0Dg{M~j-q6ZB3I9syqUpngt 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 literal 0 HcmV?d00001 diff --git a/src/games/harmonies/assets/water.png b/src/games/harmonies/assets/water.png new file mode 100644 index 0000000000000000000000000000000000000000..e32d9aa048116dc8f4de8616db64281fdd0b9b50 GIT binary patch literal 11269 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 literal 0 HcmV?d00001 diff --git a/src/games/harmonies/definition.ts b/src/games/harmonies/definition.ts new file mode 100644 index 0000000..3f6b3b0 --- /dev/null +++ b/src/games/harmonies/definition.ts @@ -0,0 +1,57 @@ +export default function getDefinition() { + return { + title: 'Harmonies', + bgColor: '#deceac', + fontColor: 'black', + primaryColor: '#0094b8', + secondaryColor: '#f7ac1f', + playerSizes: [1, 2, 3, 4], + winMode: 'most', + rows: [ + { + name: 'Leaf', + icon: 'src/games/harmonies/assets/leaf.png', + }, + { + name: 'Stone', + icon: 'src/games/harmonies/assets/stone.png', + }, + { + name: 'Flower', + icon: 'src/games/harmonies/assets/flower.png', + }, + { + name: 'House', + icon: 'src/games/harmonies/assets/house.png', + }, + { + name: 'Water', + icon: 'src/games/harmonies/assets/water.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + { + name: 'Animal', + icon: 'src/games/harmonies/assets/card.png', + }, + ], + }; +} diff --git a/src/games/seven-wonders-duel/View.tsx b/src/games/seven-wonders-duel/View.tsx new file mode 100644 index 0000000..5bd789f --- /dev/null +++ b/src/games/seven-wonders-duel/View.tsx @@ -0,0 +1,6 @@ +import BoardScorePage from '../../api/BoardScorePage/BoardScorePage'; +import getDefinition from './definition'; + +export default function SevenWondersDuelView() { + return ; +} diff --git a/src/games/seven-wonders-duel/assets/.gitkeep b/src/games/seven-wonders-duel/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/games/seven-wonders-duel/definition.ts b/src/games/seven-wonders-duel/definition.ts new file mode 100644 index 0000000..0bc11ce --- /dev/null +++ b/src/games/seven-wonders-duel/definition.ts @@ -0,0 +1,21 @@ +export default function getDefinition() { + return { + title: 'Seven Wonders: Duel', + //bgColor: '#fff', + //fontColor: '#000', + //primaryColor: '#fff', + //secondaryColor: '#000', + playerSizes: [2], + winMode: 'most', + rows: [ + { + name: 'Row1', + }, + + { + name: 'Row2', + icon: 'src/games/seven-wonders-duel/assets/test.png', + }, + ], + }; +} diff --git a/src/index.scss b/src/index.scss index 97c9827..002b3c1 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,11 +1,9 @@ :root { font-family: 'Ubuntu', sans-serif; - line-height: 1.5; font-weight: 400; - color-scheme: light dark; - color: black; - background-color: #ffffff; + color: var(--font-color); + background-color: var(--bg-color); font-synthesis: none; text-rendering: optimizeLegibility; @@ -13,6 +11,17 @@ -moz-osx-font-smoothing: grayscale; } +input { + background-color: transparent; + border: none; + text-align: center; + font-family: 'Ubuntu', sans-serif; + font-weight: bold; + &:focus { + outline: none; + } +} + body { margin: 0; padding: 0; @@ -26,3 +35,39 @@ h1 { letter-spacing: -3px; font-size: 3rem; } + +h2 { + letter-spacing: -2px; + font-size: 2.5rem; +} + +a { + text-decoration: none; + color: var(--primary-color); +} + +.btn { + cursor: pointer; + margin: 10px; + font-size: 20px; + padding: 10px 20px; + font-weight: bold; + color: var(--font-color); + border: 3px solid var(--primary-color); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.363); + border-radius: 5px; + background-color: var(--bg-color); +} + +.selected { + background-color: var(--primary-color); + color: var(--font-color); + color: var(--bg-color); +} + +.ver { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} diff --git a/src/utils/StringUtils.ts b/src/utils/StringUtils.ts new file mode 100644 index 0000000..9a83a21 --- /dev/null +++ b/src/utils/StringUtils.ts @@ -0,0 +1,9 @@ +export default class StringUtils { + static gameNameToPath(gameName: string): string { + return gameName + .toLowerCase() + .replace(/-/g, '') + .replace(/:/g, '') + .replace(/ /g, '-'); + } +} diff --git a/src/utils/StyleUtils.ts b/src/utils/StyleUtils.ts new file mode 100644 index 0000000..2a56ebf --- /dev/null +++ b/src/utils/StyleUtils.ts @@ -0,0 +1,24 @@ +export default class StyleUtils { + static setBackGroundColor(color: string = 'white') { + document.documentElement.style.setProperty('--bg-color', color); + } + + static setFontColor(color: string = 'black') { + document.documentElement.style.setProperty('--font-color', color); + } + + static setPrimaryColor(color: string = '#436fe9') { + document.documentElement.style.setProperty('--primary-color', color); + } + + static setSecondaryColor(color: string = '#f7eb83') { + document.documentElement.style.setProperty('--secondary-color', color); + } + + static setDefaultValues() { + StyleUtils.setBackGroundColor(); + StyleUtils.setFontColor(); + StyleUtils.setPrimaryColor(); + StyleUtils.setSecondaryColor(); + } +} diff --git a/src/views/HomeView.tsx b/src/views/HomeView.tsx new file mode 100644 index 0000000..d4538dd --- /dev/null +++ b/src/views/HomeView.tsx @@ -0,0 +1,44 @@ +import { useEffect } from 'react'; +import StyleUtils from '../utils/StyleUtils'; +import { useNavigate } from 'react-router-dom'; +import StringUtils from '../utils/StringUtils'; + +export default function HomeView() { + const navigate = useNavigate(); + useEffect(() => { + StyleUtils.setDefaultValues(); + document.title = 'BoardScoreHub'; + }, []); + + const games = ['Harmonies', 'Seven Wonders: Duel', 'Dorfromatik: Duel']; + games.sort((a, b) => a.localeCompare(b)); + + return ( +
+

BoardScoreHub

+
+ {games.map((game) => ( + + ))} +
+
+ by Philipp B. +
+
+ ); +}