diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2539ada6d..040758255 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,13 +36,8 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle', 'gradle.properties', '**/*.accesswidener') }} restore-keys: | ${{ runner.os }}-gradle- - - name: Download Handbook - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/handbook.html - target: src/main/resources/html/ - name: Run Gradle - run: ./gradlew -PskipHandbook=1 && ./gradlew jar -PskipHandbook=1 + run: ./gradlew && ./gradlew jar - name: Upload build uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/check_code.yml b/.github/workflows/check_code.yml index d51a41ca0..8344f88c4 100644 --- a/.github/workflows/check_code.yml +++ b/.github/workflows/check_code.yml @@ -38,7 +38,7 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - name: Format Code - run: ./gradlew -PskipHandbook=1 && ./gradlew spotlessApply -PskipHandbook=1 + run: ./gradlew && ./gradlew spotlessApply - run: git config --global user.name "github-actions" - run: git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" diff --git a/.github/workflows/handbook.yml b/.github/workflows/handbook.yml deleted file mode 100644 index 1aed0ea37..000000000 --- a/.github/workflows/handbook.yml +++ /dev/null @@ -1,126 +0,0 @@ -name: "Handbook" - -on: - workflow_dispatch: ~ - push: - paths: - - "src/handbook/**.tsx" - branches: - - "development" - - "unstable" - pull_request: - paths: - - "src/handbook/**.tsx" - types: - - opened - - synchronize - - reopened - -jobs: - Lint-Code: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Extract branch name - shell: bash - run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT - id: extract_branch - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '17' - - name: Cache node modules - uses: actions/cache@v2 - with: - path: | - ~/.npm - ~/.cache - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Install dependencies - working-directory: src/handbook - run: npm install --force - - name: Run linter - working-directory: src/handbook - run: npm run lint - - - run: git config --global user.name "github-actions" - - run: git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - run: git stash - - run: git checkout ${{ steps.extract_branch.outputs.branch }} && git pull - - run: git stash pop || true - - name: Commit changes - if: ${{ github.event_name == 'push' }} - run: git add -u && git commit -m "Lint Code [skip actions]" || true - - name: Push changes - if: ${{ github.event_name == 'push' }} - run: git push --set-upstream --force origin ${{ steps.extract_branch.outputs.branch }} - - Build-Handbook: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '17' - - name: Cache node modules - uses: actions/cache@v2 - with: - path: | - ~/.npm - ~/.cache - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Install dependencies - working-directory: src/handbook - run: npm install --force - - - name: Download Avatar Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/avatars.csv - target: src/handbook/data/ - - name: Download Command Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/commands.json - target: src/handbook/data/ - - name: Download Entity Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/entities.csv - target: src/handbook/data/ - - name: Download Item Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/items.csv - target: src/handbook/data/ - - name: Download Scene Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/scenes.csv - target: src/handbook/data/ - - name: Download Quest Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/quests.csv - target: src/handbook/data/ - - name: Download Main Quest Data - uses: suisei-cn/actions-download-file@v1.4.0 - with: - url: https://api.grasscutter.io/static/mainquests.csv - target: src/handbook/data/ - - - name: Build handbook - working-directory: src/handbook - run: npm run build - - name: Upload build - uses: actions/upload-artifact@v3 - with: - name: Handbook - path: src/handbook/dist/*.html diff --git a/.gitignore b/.gitignore index 0ee3fb69f..b60256f5e 100644 --- a/.gitignore +++ b/.gitignore @@ -67,7 +67,6 @@ tmp/ !entrypoint.sh GM Handbook*.txt -handbook.html config.json mitmdump.exe diff --git a/.gitmodules b/.gitmodules index a74aee594..b5c356217 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "docs/wiki"] path = docs/wiki url = https://github.com/Grasscutters/Grasscutter.wiki.git -[submodule "src/handbook/data/assets"] - path = src/handbook/data/assets - url = https://github.com/genshitters/gm-handbook-assets.git diff --git a/README.md b/README.md index 4e522474e..fb3f4eb15 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ [4.0.x Client-cloud drive](https://www.123pan.com/s/HoqUVv-U7SBA.html) - Download the [latest Cultivation version](https://github.com/Grasscutters/Cultivation/releases/latest). Use the `.msi` installer. -- After opening Cultivation (as admin), press the download button in the upper right corner. +- After opening Cultivation (as admin), press the download button in the upper right corner. - Click `Download All-in-One` - Click the gear in the upper right corner - Set the game Install path to where your game is located. @@ -50,7 +50,6 @@ Grasscutter uses Gradle to handle dependencies & building. - [Java Development Kit 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) or higher - [Git](https://git-scm.com/downloads) -- [NodeJS](https://nodejs.org/en/download) (Optional, for building the handbook) ##### Clone @@ -61,8 +60,6 @@ cd Grasscutter ##### Compile -**Note**: Handbook generation may fail on some systems. To disable the handbook generation, append `-PskipHandbook=1` to the `gradlew jar` command. - Windows: ```shell @@ -77,24 +74,6 @@ chmod +x gradlew ./gradlew jar ``` -##### Compiling the Handbook (Manually) - -With Gradle: - -```shell -./gradlew generateHandbook -``` - -With NPM: - -```shell -cd src/handbook -npm install -npm run build -``` - -You can find the output jar in the root of the project folder. - -### Troubleshooting +### Troubleshooting For a list of common issues and solutions and to ask for help, please join [our Discord server](https://discord.gg/T5vZU6UyeG) and go to the support channel. diff --git a/build.gradle b/build.gradle index 67d1dbee3..a0375b48f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,3 @@ -import org.apache.tools.ant.taskdefs.condition.Os import org.gradle.plugins.ide.eclipse.model.SourceFolder /* @@ -311,7 +310,6 @@ javadoc { // Add this to avoid warning caused by lack of comments in proto generated java files options.addStringOption('Xdoclint:none', '-quiet') exclude '**/*.md' - exclude 'src/handbook/**/*.*' exclude 'src/generated/**/*.*' } @@ -332,81 +330,6 @@ public final class BuildConfig { }""" } -tasks.register('generateHandbook') { - if (project.hasProperty('skipHandbook')) { - println('Skipping handbook generation.') - return - } - - // Resolve the NPM command. - var npm = 'npm' - if (Os.isFamily(Os.FAMILY_WINDOWS)) - npm = 'npm.cmd' - - def npmVersion = { - try { - return "${npm} --version".execute() - } catch (ignored) { - ignored.printStackTrace() - return 'NPM_NOT_FOUND' - } - } - - // Check if Node is installed. - if (npmVersion() == 'NPM_NOT_FOUND') { - println('NPM is not installed. Skipping handbook generation.') - } else { - // Check if the handbook resources are present. - if (!file('src/handbook/data/commands.json').exists()) { - println('Command data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/avatars.csv').exists()) { - println('Avatar data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/entities.csv').exists()) { - println('Entity data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/items.csv').exists()) { - println('Item data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/mainquests.csv').exists()) { - println('Main quest data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/quests.csv').exists()) { - println('Quest data was not found. Skipping handbook generation.') - return - } - if (!file('src/handbook/data/scenes.csv').exists()) { - println('Scene data was not found. Skipping handbook generation.') - return - } - - // Install dependencies before building. - exec { - workingDir 'src/handbook' - commandLine npm, 'install' - } - - // Build the handbook. - exec { - workingDir 'src/handbook' - commandLine npm, 'run', 'build' - } - - // Copy the handbook from /dist to /src/main/resources. - copy { - from 'src/handbook/dist/index.html' - into 'src/main/resources/html' - rename 'index.html', 'handbook.html' - } - } -} - processResources { dependsOn 'generateProto' } diff --git a/src/handbook/.gitignore b/src/handbook/.gitignore deleted file mode 100644 index e1c33ad6e..000000000 --- a/src/handbook/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -# Handbook data -data/ \ No newline at end of file diff --git a/src/handbook/.prettierrc b/src/handbook/.prettierrc deleted file mode 100644 index a370e477a..000000000 --- a/src/handbook/.prettierrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "arrowParens": "always", - "bracketSpacing": true, - "endOfLine": "lf", - "jsxSingleQuote": false, - "jsxBracketSameLine": false, - "semi": true, - "singleQuote": false, - "tabWidth": 4, - "trailingComma": "none", - "useTabs": false -} \ No newline at end of file diff --git a/src/handbook/cfg/postcss.config.js b/src/handbook/cfg/postcss.config.js deleted file mode 100644 index 1962ca60c..000000000 --- a/src/handbook/cfg/postcss.config.js +++ /dev/null @@ -1,25 +0,0 @@ -import tailwind from "tailwindcss"; -import autoprefixer from "autoprefixer"; -import cssnanoPlugin from "cssnano"; - -import tailwindConfig from "./tailwind.config.js"; -const mode = process.env.NODE_ENV; -const dev = mode === "development"; - -export default { - plugins: (() => { - let plugins = [ - // Some plugins, like TailwindCSS/Nesting, need to run before Tailwind. - tailwind(tailwindConfig), - - // But others, like autoprefixer, need to run after. - autoprefixer() - ]; - - !dev && cssnanoPlugin({ - preset: "default" - }); - - return plugins; - })() -} diff --git a/src/handbook/cfg/tailwind.config.js b/src/handbook/cfg/tailwind.config.js deleted file mode 100644 index 6a004f99f..000000000 --- a/src/handbook/cfg/tailwind.config.js +++ /dev/null @@ -1,9 +0,0 @@ -export default { - content: ["./src/**/*.{html,js,tsx,ts}"], - mode: "jit", - theme: { - extend: {} - }, - darkMode: "class", - plugins: [] -}; diff --git a/src/handbook/data/README.md b/src/handbook/data/README.md deleted file mode 100644 index cca009ce5..000000000 --- a/src/handbook/data/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Handbook Data -Use Grasscutter's dumpers to generate the data to put here. - -# Generating Data - -When you have Grasscutter set up, you can use the following commands to generate the data: -- Commands - `grasscutter.jar -dump=commands,en-us` -- Items - `grasscutter.jar -dump=items,EN` -- Avatars - `grasscutter.jar -dump=avatars,EN` -- Quests - `grasscutter.jar -dump=quests,EN` -- Entities - `grasscutter.jar -dump=entities,en-us` -- Areas - `grasscutter.jar -dump=areas,EN` -- Scenes - `grasscutter.jar -dump=scenes,en-us` - -Grasscutter being "set up" means: -- A Java runtime is installed -- Resources are provided in the working directory - -## Language Locales - -You can replace `en-us` or `EN` using the language locale which matches the format. - -| Grasscutter Language Locale | Handbook Language Locale | -|-----------------------------|--------------------------| -| en-us | EN | - - -## Files Required -- `mainquests.csv` -- `commands.json` -- `entities.csv` -- `avatars.csv` -- `scenes.csv` -- `quests.csv` -- `items.csv` - -# Item Icon Notes -- Artifacts: `https://bbs.hoyolab.com/hoyowiki/picture/reliquary/(name)/(piece)_icon.png` - - Alternate source: `https://api.ambr.top/assets/UI/reliquary/UI_RelicIcon_(set)_(piece).png` - - `xxxx4` - `flower_of_life` - - `xxxx5` - `sands_of_eon` - - `xxxx3` - `circlet_of_logos`/`plume_of_death` - - Use `circlet_of_logos` with a complete set - - Use `plume_of_death` with part of a set. - - `xxxx2` - `plume_of_death` - - `xxxx1` - `goblet_of_eonothem` -- Miscellaneous Items: `https://bbs.hoyolab.com/hoyowiki/picture/object/(name)_icon.png` - - Includes: materials, quest items, food, etc. - - Alternate source: `https://api.ambr.top/assets/UI/UI_ItemIcon_(id).png` -- Avatars/Avatar Items: `https://bbs.hoyolab.com/hoyowiki/picture/character/(name)_icon.png` - - Avatar Items are between ranges `1001` and `1099`. -- Weapons: `https://api.ambr.top/assets/UI/UI_EquipIcon_(type)_(name).png` -- Furniture: `https://api.ambr.top/assets/UI/furniture/UI_Homeworld_(location)_(name).png` -- Monsters: `https://api.ambr.top/assets/UI/monster/UI_MonsterIcon_(type)_(variant).png` - -# Credits -- [`...List.json` files](https://raw.githubusercontent.com/Dituon/grasscutter-command-helper/main/data/en-US) - Grasscutter Command Helper -- [Internal Asset API](https://ambr.top) - Project Amber diff --git a/src/handbook/data/assets b/src/handbook/data/assets deleted file mode 160000 index 1b9f8b2c0..000000000 --- a/src/handbook/data/assets +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1b9f8b2c0d60a9c06a6eb6ad5fc21c55afd926fd diff --git a/src/handbook/index.html b/src/handbook/index.html deleted file mode 100644 index b2fc29c98..000000000 --- a/src/handbook/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - GM Handbook - - - - - -
- - - diff --git a/src/handbook/package-lock.json b/src/handbook/package-lock.json deleted file mode 100644 index 9dff93093..000000000 --- a/src/handbook/package-lock.json +++ /dev/null @@ -1,6236 +0,0 @@ -{ - "name": "handbook", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "handbook", - "version": "0.1.0", - "hasInstallScript": true, - "dependencies": { - "events": "^3.3.0", - "react": "^18.2.0", - "react-collapsible": "^2.10.0", - "react-d3-tree": "^3.6.1", - "react-dom": "^18.2.0", - "react-icons": "^4.8.0", - "react-virtualized": "^9.22.3" - }, - "devDependencies": { - "@rollup/plugin-dsv": "^3.0.2", - "@types/events": "^3.0.0", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@types/react-virtualized": "^9.21.21", - "@vitejs/plugin-react-swc": "^3.0.0", - "autoprefixer": "^10.4.13", - "cssnano": "^5.1.15", - "patch-package": "^6.5.1", - "postcss": "^8.4.21", - "postcss-font-magician": "^3.0.0", - "postcss-load-config": "^4.0.1", - "prettier": "^2.8.7", - "sass": "^1.58.3", - "tailwindcss": "^3.2.7", - "typescript": "^4.9.3", - "vite": "^4.2.0", - "vite-plugin-singlefile": "^0.13.5", - "vite-plugin-svgr": "^2.4.0", - "vite-tsconfig-paths": "^4.0.7" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bkrem/react-transition-group": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.3.tgz", - "integrity": "sha512-nUZaumHu/MMolELv+MhEEQzQtKsnfpbKBHtam/NK53tGICwU19tuffEXW8BLhm9HhQfN1H3+C0bsJv8Z7vzwEA==", - "dependencies": { - "chain-function": "^1.0.0", - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.6", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@bkrem/react-transition-group/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.15", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-dsv": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/d3-dsv": "^3.0.0", - "d3-dsv": "2.0.0", - "tosource": "^2.0.0-alpha.3" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { - "version": "4.4.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@swc/core": { - "version": "1.3.44", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.44", - "@swc/core-darwin-x64": "1.3.44", - "@swc/core-linux-arm-gnueabihf": "1.3.44", - "@swc/core-linux-arm64-gnu": "1.3.44", - "@swc/core-linux-arm64-musl": "1.3.44", - "@swc/core-linux-x64-gnu": "1.3.44", - "@swc/core-linux-x64-musl": "1.3.44", - "@swc/core-win32-arm64-msvc": "1.3.44", - "@swc/core-win32-ia32-msvc": "1.3.44", - "@swc/core-win32-x64-msvc": "1.3.44" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.44", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/events": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-virtualized": { - "version": "9.21.21", - "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.21.tgz", - "integrity": "sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/react": "^17" - } - }, - "node_modules/@types/react-virtualized/node_modules/@types/react": { - "version": "17.0.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.56.tgz", - "integrity": "sha512-Z13f9Qz7Hg8f2g2NsBjiJSVWmON2b3K8RIqFK8mMKCIgvD0CD0ZChTukz87H3lI28X3ukXoNFGzo3ZW1ICTtPA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@swc/core": "^1.3.35" - }, - "peerDependencies": { - "vite": "^4" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/amdefine": { - "version": "1.0.1", - "dev": true, - "license": "BSD-3-Clause OR MIT", - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b3b": { - "version": "0.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/bootstrap-fonts-complete": { - "version": "1.0.0", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "postcss": "^4.1.16" - } - }, - "node_modules/bootstrap-fonts-complete/node_modules/postcss": { - "version": "4.1.16", - "dev": true, - "license": "MIT", - "dependencies": { - "es6-promise": "~2.3.0", - "js-base64": "~2.1.8", - "source-map": "~0.4.2" - } - }, - "node_modules/bootstrap-fonts-complete/node_modules/source-map": { - "version": "0.4.4", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brotli": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001473", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chain-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", - "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" - }, - "node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-convert/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "dev": true, - "license": "MIT", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "2.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/directory-fonts-complete": { - "version": "1.2.0", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "brotli": "^1.3.2", - "is-eot": "^1.0.0", - "is-otf": "^0.1.1", - "is-ttf": "^0.2.1", - "is-woff": "^1.0.1", - "is-woff2": "^1.0.0" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.349", - "dev": true, - "license": "ISC" - }, - "node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es6-promise": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.17.15", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/google-fonts-complete": { - "version": "2.1.1", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "postcss": "^7.0.18" - } - }, - "node_modules/google-fonts-complete/node_modules/picocolors": { - "version": "0.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/google-fonts-complete/node_modules/postcss": { - "version": "7.0.39", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "4.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-eot": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-otf": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "b3b": "0.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-ttf": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "b3b": "0.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-woff": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-woff2": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.18.2", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-base64": { - "version": "2.1.9", - "dev": true, - "license": "BSD" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dev": true, - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=10", - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/patch-package/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/patch-package/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/patch-package/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.21", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-font-magician": { - "version": "3.0.0", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "bootstrap-fonts-complete": "^1.0.0", - "directory-fonts-complete": "^1.2.0", - "google-fonts-complete": "^2.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.2.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/prettier": { - "version": "2.8.7", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-collapsible": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/react-collapsible/-/react-collapsible-2.10.0.tgz", - "integrity": "sha512-kEVsmlFfXBMTCnU5gwIv19MdmPAhbIPzz5Er37TiJSzRKS0IHrqAKQyQeHEmtoGIQMTcVI46FzE4z3NlVTx77A==", - "peerDependencies": { - "react": "~15 || ~16 || ~17 || ~18", - "react-dom": "~15 || ~16 || ~17 || ~18" - } - }, - "node_modules/react-d3-tree": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.6.1.tgz", - "integrity": "sha512-tl7P3Wg5q/ep6c7z6wPgf3vpqaxZ1yQi/rpvIePj3vt7XGwdP3Vdr9GBIZXw7K2CrMknoyoDIbPSNaZtZZ6MIg==", - "dependencies": { - "@bkrem/react-transition-group": "^1.3.3", - "@types/d3-hierarchy": "^1.1.8", - "clone": "^2.1.1", - "d3-hierarchy": "^1.1.9", - "d3-selection": "^3.0.0", - "d3-shape": "^1.3.7", - "d3-zoom": "^3.0.0", - "dequal": "^2.0.2", - "uuid": "^8.3.1" - }, - "peerDependencies": { - "react": "16.x || 17.x || 18.x", - "react-dom": "16.x || 17.x || 18.x" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-icons": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", - "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-virtualized": { - "version": "9.22.3", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", - "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha", - "react-dom": "^15.3.0 || ^16.0.0-alpha" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rollup": { - "version": "3.20.2", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.60.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/sucrase": { - "version": "3.31.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/svgo": { - "version": "2.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tosource": { - "version": "2.0.0-alpha.3", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfck": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vite": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-singlefile": { - "version": "0.13.5", - "dev": true, - "license": "MIT", - "dependencies": { - "micromatch": "^4.0.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "rollup": ">=2.79.0", - "vite": ">=3.2.0" - } - }, - "node_modules/vite-plugin-svgr": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.2", - "@svgr/core": "^6.5.1" - }, - "peerDependencies": { - "vite": "^2.6.0 || 3 || 4" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.4", - "dev": true - }, - "@babel/core": { - "version": "7.21.4", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/types": "^7.21.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "dev": true - }, - "@babel/helpers": { - "version": "7.21.0", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.21.4", - "dev": true - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.4", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bkrem/react-transition-group": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.3.tgz", - "integrity": "sha512-nUZaumHu/MMolELv+MhEEQzQtKsnfpbKBHtam/NK53tGICwU19tuffEXW8BLhm9HhQfN1H3+C0bsJv8Z7vzwEA==", - "requires": { - "chain-function": "^1.0.0", - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.6", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - } - } - }, - "@esbuild/win32-x64": { - "version": "0.17.15", - "dev": true, - "optional": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-dsv": { - "version": "3.0.2", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.0.1", - "@types/d3-dsv": "^3.0.0", - "d3-dsv": "2.0.0", - "tosource": "^2.0.0-alpha.3" - } - }, - "@rollup/pluginutils": { - "version": "5.0.2", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "7.0.0", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "7.0.0", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "dev": true, - "requires": {} - }, - "@svgr/babel-preset": { - "version": "6.5.1", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - } - }, - "@svgr/core": { - "version": "6.5.1", - "dev": true, - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "dev": true, - "requires": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "dependencies": { - "entities": { - "version": "4.4.0", - "dev": true - } - } - }, - "@svgr/plugin-jsx": { - "version": "6.5.1", - "dev": true, - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - } - }, - "@swc/core": { - "version": "1.3.44", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.3.44", - "@swc/core-darwin-x64": "1.3.44", - "@swc/core-linux-arm-gnueabihf": "1.3.44", - "@swc/core-linux-arm64-gnu": "1.3.44", - "@swc/core-linux-arm64-musl": "1.3.44", - "@swc/core-linux-x64-gnu": "1.3.44", - "@swc/core-linux-x64-musl": "1.3.44", - "@swc/core-win32-arm64-msvc": "1.3.44", - "@swc/core-win32-ia32-msvc": "1.3.44", - "@swc/core-win32-x64-msvc": "1.3.44" - } - }, - "@swc/core-win32-x64-msvc": { - "version": "1.3.44", - "dev": true, - "optional": true - }, - "@trysound/sax": { - "version": "0.2.0", - "dev": true - }, - "@types/d3-dsv": { - "version": "3.0.1", - "dev": true - }, - "@types/d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==" - }, - "@types/estree": { - "version": "1.0.0", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "dev": true - }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true, - "optional": true, - "peer": true - }, - "@types/parse-json": { - "version": "4.0.0", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "dev": true - }, - "@types/react": { - "version": "18.0.33", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.11", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-virtualized": { - "version": "9.21.21", - "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.21.tgz", - "integrity": "sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/react": "^17" - }, - "dependencies": { - "@types/react": { - "version": "17.0.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.56.tgz", - "integrity": "sha512-Z13f9Qz7Hg8f2g2NsBjiJSVWmON2b3K8RIqFK8mMKCIgvD0CD0ZChTukz87H3lI28X3ukXoNFGzo3ZW1ICTtPA==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - } - } - }, - "@types/scheduler": { - "version": "0.16.3", - "dev": true - }, - "@vitejs/plugin-react-swc": { - "version": "3.2.0", - "dev": true, - "requires": { - "@swc/core": "^1.3.35" - } - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.14", - "dev": true, - "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "b3b": { - "version": "0.0.1", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "dev": true - }, - "bootstrap-fonts-complete": { - "version": "1.0.0", - "dev": true, - "requires": { - "postcss": "^4.1.16" - }, - "dependencies": { - "postcss": { - "version": "4.1.16", - "dev": true, - "requires": { - "es6-promise": "~2.3.0", - "js-base64": "~2.1.8", - "source-map": "~0.4.2" - } - }, - "source-map": { - "version": "0.4.4", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brotli": { - "version": "1.3.3", - "dev": true, - "requires": { - "base64-js": "^1.1.2" - } - }, - "browserslist": { - "version": "4.21.5", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "callsites": { - "version": "3.1.0", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001473", - "dev": true - }, - "chain-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", - "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" - }, - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "color-convert": { - "version": "1.9.3", - "dev": true, - "requires": { - "color-name": "1.1.3" - }, - "dependencies": { - "color-name": { - "version": "1.1.3", - "dev": true - } - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "colord": { - "version": "2.9.3", - "dev": true - }, - "commander": { - "version": "7.2.0", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "dev": true - }, - "cosmiconfig": { - "version": "7.1.0", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "css-declaration-sorter": { - "version": "6.4.0", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "dev": true - }, - "cssnano": { - "version": "5.1.15", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.14", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.2" - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-dsv": { - "version": "2.0.0", - "dev": true, - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "dev": true - } - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "requires": { - "d3-path": "1" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - } - }, - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "didyoumean": { - "version": "1.2.2", - "dev": true - }, - "directory-fonts-complete": { - "version": "1.2.0", - "dev": true, - "requires": { - "brotli": "^1.3.2", - "is-eot": "^1.0.0", - "is-otf": "^0.1.1", - "is-ttf": "^0.2.1", - "is-woff": "^1.0.1", - "is-woff2": "^1.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "dev": true - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.349", - "dev": true - }, - "entities": { - "version": "2.2.0", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "2.3.0", - "dev": true - }, - "esbuild": { - "version": "0.17.15", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" - } - }, - "escalade": { - "version": "3.1.1", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "dev": true - }, - "events": { - "version": "3.3.0" - }, - "fast-glob": { - "version": "3.2.12", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "requires": { - "micromatch": "^4.0.2" - } - }, - "fraction.js": { - "version": "4.2.0", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "dev": true - }, - "glob": { - "version": "7.1.6", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "dev": true - }, - "globrex": { - "version": "0.1.2", - "dev": true - }, - "google-fonts-complete": { - "version": "2.1.1", - "dev": true, - "requires": { - "postcss": "^7.0.18" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - } - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "immutable": { - "version": "4.3.0", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-eot": { - "version": "1.0.0", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-otf": { - "version": "0.1.2", - "dev": true, - "requires": { - "b3b": "0.0.1" - } - }, - "is-ttf": { - "version": "0.2.2", - "dev": true, - "requires": { - "b3b": "0.0.1" - } - }, - "is-woff": { - "version": "1.0.3", - "dev": true - }, - "is-woff2": { - "version": "1.0.0", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "jiti": { - "version": "1.18.2", - "dev": true - }, - "js-base64": { - "version": "2.1.9", - "dev": true - }, - "js-tokens": { - "version": "4.0.0" - }, - "jsesc": { - "version": "2.5.2", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true - }, - "json5": { - "version": "2.2.3", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "lilconfig": { - "version": "2.1.0", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "mdn-data": { - "version": "2.0.14", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "dev": true - }, - "mz": { - "version": "2.7.0", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.6", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-releases": { - "version": "2.0.10", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "dev": true - }, - "nth-check": { - "version": "2.1.1", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1" - }, - "object-hash": { - "version": "3.0.0", - "dev": true - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pify": { - "version": "2.3.0", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "dev": true - }, - "postcss": { - "version": "8.4.21", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.1", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-font-magician": { - "version": "3.0.0", - "dev": true, - "requires": { - "bootstrap-fonts-complete": "^1.0.0", - "directory-fonts-complete": "^1.2.0", - "google-fonts-complete": "^2.1.1" - } - }, - "postcss-import": { - "version": "14.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.1", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "dependencies": { - "yaml": { - "version": "2.2.1", - "dev": true - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.4", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-nested": { - "version": "6.0.0", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.2", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "dev": true - }, - "prettier": { - "version": "2.8.7", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "queue-microtask": { - "version": "1.2.3", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "dev": true - }, - "react": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-collapsible": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/react-collapsible/-/react-collapsible-2.10.0.tgz", - "integrity": "sha512-kEVsmlFfXBMTCnU5gwIv19MdmPAhbIPzz5Er37TiJSzRKS0IHrqAKQyQeHEmtoGIQMTcVI46FzE4z3NlVTx77A==", - "requires": {} - }, - "react-d3-tree": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.6.1.tgz", - "integrity": "sha512-tl7P3Wg5q/ep6c7z6wPgf3vpqaxZ1yQi/rpvIePj3vt7XGwdP3Vdr9GBIZXw7K2CrMknoyoDIbPSNaZtZZ6MIg==", - "requires": { - "@bkrem/react-transition-group": "^1.3.3", - "@types/d3-hierarchy": "^1.1.8", - "clone": "^2.1.1", - "d3-hierarchy": "^1.1.9", - "d3-selection": "^3.0.0", - "d3-shape": "^1.3.7", - "d3-zoom": "^3.0.0", - "dequal": "^2.0.2", - "uuid": "^8.3.1" - } - }, - "react-dom": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-icons": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", - "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", - "requires": {} - }, - "react-is": { - "version": "16.13.1" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-virtualized": { - "version": "9.22.3", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", - "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", - "requires": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" - } - }, - "read-cache": { - "version": "1.0.0", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "resolve": { - "version": "1.22.1", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.20.2", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rw": { - "version": "1.3.3", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "dev": true - }, - "sass": { - "version": "1.60.0", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "scheduler": { - "version": "0.23.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "semver": { - "version": "6.3.0", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "dev": true - }, - "stable": { - "version": "0.1.8", - "dev": true - }, - "stylehacks": { - "version": "5.1.1", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "sucrase": { - "version": "3.31.0", - "dev": true, - "requires": { - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "svg-parser": { - "version": "2.0.4", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "tailwindcss": { - "version": "3.3.1", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - } - } - }, - "thenify": { - "version": "3.3.1", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tosource": { - "version": "2.0.0-alpha.3", - "dev": true - }, - "ts-interface-checker": { - "version": "0.1.13", - "dev": true - }, - "tsconfck": { - "version": "2.1.1", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "4.9.5", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "vite": { - "version": "4.2.1", - "dev": true, - "requires": { - "esbuild": "^0.17.5", - "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" - } - }, - "vite-plugin-singlefile": { - "version": "0.13.5", - "dev": true, - "requires": { - "micromatch": "^4.0.5" - } - }, - "vite-plugin-svgr": { - "version": "2.4.0", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.0.2", - "@svgr/core": "^6.5.1" - } - }, - "vite-tsconfig-paths": { - "version": "4.0.8", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "dev": true - } - } -} diff --git a/src/handbook/package.json b/src/handbook/package.json deleted file mode 100644 index 96df1926a..000000000 --- a/src/handbook/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "handbook", - "description": "The ultimate anime game handbook!", - "version": "0.1.0", - - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - - "postinstall": "npx patch-package", - "lint": "npx prettier --write \"src/**/*.{ts,tsx,js,jsx,json,md}\"" - }, - - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^4.8.0", - "react-d3-tree": "^3.6.1", - "react-collapsible": "^2.10.0", - "react-virtualized": "^9.22.3", - - "events": "^3.3.0" - }, - "devDependencies": { - "typescript": "^4.9.3", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@types/react-virtualized": "^9.21.21", - "@types/events": "^3.0.0", - - "vite": "^4.2.0", - "vite-plugin-svgr": "^2.4.0", - "vite-tsconfig-paths": "^4.0.7", - "vite-plugin-singlefile": "^0.13.5", - "@vitejs/plugin-react-swc": "^3.0.0", - "@rollup/plugin-dsv": "^3.0.2", - - "sass": "^1.58.3", - "cssnano": "^5.1.15", - "tailwindcss": "^3.2.7", - "autoprefixer": "^10.4.13", - - "postcss": "^8.4.21", - "postcss-load-config": "^4.0.1", - "postcss-font-magician": "^3.0.0", - - "prettier": "^2.8.7", - "patch-package": "^6.5.1" - } -} diff --git a/src/handbook/patches/react-virtualized+9.22.3.patch b/src/handbook/patches/react-virtualized+9.22.3.patch deleted file mode 100644 index d40d28db9..000000000 --- a/src/handbook/patches/react-virtualized+9.22.3.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff --git a/node_modules/react-virtualized/dist/es/WindowScroller/utils/onScroll.js b/node_modules/react-virtualized/dist/es/WindowScroller/utils/onScroll.js -index d00f0f1..42456dc 100644 ---- a/node_modules/react-virtualized/dist/es/WindowScroller/utils/onScroll.js -+++ b/node_modules/react-virtualized/dist/es/WindowScroller/utils/onScroll.js -@@ -71,4 +71,3 @@ export function unregisterScrollListener(component, element) { - } - } - } --import { bpfrpt_proptype_WindowScroller } from "../WindowScroller.js"; -\ No newline at end of file diff --git a/src/handbook/src/backend/commands.ts b/src/handbook/src/backend/commands.ts deleted file mode 100644 index a6d9c71e2..000000000 --- a/src/handbook/src/backend/commands.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Validates a number. - * - * @param value The number to validate. - */ -function invalid(value: number): boolean { - return isNaN(value) || value < 0; -} - -/** - * Generates a basic give command. - */ -function basicGive(item: number, amount = 1): string { - // Validate the numbers. - if (invalid(item) || invalid(amount)) return "Invalid arguments."; - - return `/give ${item} x${amount}`; -} - -/** - * Generates a basic teleport command. - * This creates a relative teleport command. - */ -function teleport(scene: number): string { - // Validate the number. - if (invalid(scene)) return "Invalid arguments."; - - return `/teleport ~ ~ ~ ${scene}`; -} - -/** - * Generates a basic spawn monster command. - * - * @param monster The monster's ID. - * @param amount The amount of the monster to spawn. - * @param level The level of the monster to spawn. - */ -function spawnMonster(monster: number, amount = 1, level = 1): string { - // Validate the numbers. - if (invalid(monster) || invalid(amount)) return "Invalid arguments."; - - return `/spawn ${monster} x${amount} lv${level}`; -} - -export const give = { - basic: basicGive -}; - -export const spawn = { - monster: spawnMonster -}; - -export const action = { - teleport: teleport -}; diff --git a/src/handbook/src/backend/data.ts b/src/handbook/src/backend/data.ts deleted file mode 100644 index a6f7e614c..000000000 --- a/src/handbook/src/backend/data.ts +++ /dev/null @@ -1,245 +0,0 @@ -import mainQuests from "@data/mainquests.csv"; -import commands from "@data/commands.json"; -import entities from "@data/entities.csv"; -import avatars from "@data/avatars.csv"; -import scenes from "@data/scenes.csv"; -import quests from "@data/quests.csv"; -import items from "@data/items.csv"; - -import type { RawNodeDatum } from "react-d3-tree"; - -import { Quality, ItemType, ItemCategory, SceneType } from "@backend/types"; -import type { MainQuest, Command, Avatar, Item, Scene, Entity, Quest } from "@backend/types"; - -import { inRange } from "@app/utils"; - -type AvatarDump = { [key: number]: Avatar }; -type CommandDump = { [key: string]: Command }; -type TaggedItems = { [key: number]: Item[] }; -type QuestDump = { [key: number]: Quest }; -type MainQuestDump = { [key: number]: MainQuest }; - -/** - * @see {@file src/handbook/data/README.md} - */ - -export const sortedItems: TaggedItems = { - [ItemCategory.Constellation]: [], // Range: 1102 - 11xx - [ItemCategory.Avatar]: [], // Range: 1002 - 10xx - [ItemCategory.Weapon]: [], - [ItemCategory.Artifact]: [], - [ItemCategory.Furniture]: [], - [ItemCategory.Material]: [], - [ItemCategory.Miscellaneous]: [] -}; - -export let allMainQuests: MainQuestDump = {}; - -/** - * Setup function for this file. - * Sorts all items into their respective categories. - */ -export function setup(): void { - getItems().forEach((item) => { - switch (item.type) { - case ItemType.Weapon: - sortedItems[ItemCategory.Weapon].push(item); - break; - case ItemType.Material: - sortedItems[ItemCategory.Material].push(item); - break; - case ItemType.Furniture: - sortedItems[ItemCategory.Furniture].push(item); - break; - case ItemType.Reliquary: - sortedItems[ItemCategory.Artifact].push(item); - break; - } - - // Sort constellations. - if (inRange(item.id, 1102, 1199)) { - sortedItems[ItemCategory.Constellation].push(item); - } - // Sort avatars. - if (inRange(item.id, 1002, 1099)) { - sortedItems[ItemCategory.Avatar].push(item); - } - }); - - allMainQuests = getMainQuests(); -} - -/** - * Fetches and casts all commands in the file. - */ -export function getCommands(): CommandDump { - return commands as CommandDump; -} - -/** - * Fetches and lists all the commands in the file. - */ -export function listCommands(): Command[] { - return Object.values(getCommands()).sort((a, b) => a.name[0].localeCompare(b.name[0])); -} - -/** - * Fetches and casts all entities in the file. - */ -export function getEntities(): Entity[] { - return entities - .map((entry) => { - const values = Object.values(entry) as string[]; - const id = parseInt(values[0]); - return { - id, - name: values[1], - internal: values[2] - }; - }) - .filter((entity) => !entity.name.includes("Mechanicus")); -} - -/** - * Fetches and casts all avatars in the file. - */ -export function getAvatars(): AvatarDump { - const map: AvatarDump = {}; - avatars.forEach((avatar) => { - const values = Object.values(avatar) as [string, string, string]; - const id = parseInt(values[0]); - map[id] = { - id, - name: values[1], - quality: values[2] as Quality - }; - }); - - return map; -} - -/** - * Fetches and lists all the avatars in the file. - */ -export function listAvatars(): Avatar[] { - return Object.values(getAvatars()).sort((a, b) => a.name.localeCompare(b.name)); -} - -/** - * Fetches and casts all scenes in the file. - */ -export function getScenes(): Scene[] { - return scenes - .map((entry) => { - const values = Object.values(entry) as string[]; - const id = parseInt(values[0]); - return { - id, - identifier: values[1], - type: values[2] as SceneType - }; - }) - .sort((a, b) => a.id - b.id); -} - -/** - * Fetches and casts all items in the file. - */ -export function getItems(): Item[] { - return items.map((entry) => { - const values = Object.values(entry) as string[]; - const id = parseInt(values[0]); - return { - id, - name: values[1], - type: values[3] as ItemType, - quality: values[2] as Quality, - icon: values[4] - }; - }); -} - -/** - * Fetches and casts all quests in the file. - */ -export function getQuests(): QuestDump { - const map: QuestDump = {}; - quests.forEach((quest: Quest) => { - quest.description = quest.description.replaceAll("\\", ","); - map[quest.id] = quest; - }); - - return map; -} - -/** - * Fetches and lists all the quests in the file. - */ -export function listQuests(): Quest[] { - return Object.values(getQuests()).sort((a, b) => a.id - b.id); -} - -/** - * Fetches and casts all quests in the file. - */ -export function getMainQuests(): MainQuestDump { - const map: MainQuestDump = {}; - mainQuests.forEach((quest: MainQuest) => { - quest.title = quest.title.replaceAll("\\", ","); - map[quest.id] = quest; - }); - - return map; -} - -/** - * Fetches and lists all the quests in the file. - */ -export function listMainQuests(): MainQuestDump[] { - return Object.values(allMainQuests).sort((a, b) => a.id - b.id); -} - -/** - * Fetches a quest by its ID. - * - * @param quest The quest ID. - */ -export function getMainQuestFor(quest: Quest): MainQuest { - return allMainQuests[quest.mainId]; -} - -/** - * Fetches all quests for a main quest. - * - * @param mainQuest The main quest to fetch quests for. - */ -export function listSubQuestsFor(mainQuest: MainQuest): Quest[] { - return listQuests().filter((quest) => quest.mainId == mainQuest.id); -} - -/* - * Tree conversion methods. - */ - -/** - * Converts a quest to a tree. - * - * @param mainQuest The main quest to convert. - */ -export function questToTree(mainQuest: MainQuest): RawNodeDatum { - return { - name: mainQuest.title, - attributes: { - id: mainQuest.id - }, - children: listSubQuestsFor(mainQuest).map((quest) => { - return { - name: quest.id.toString(), - attributes: { - description: quest.description - }, - children: [] - } as RawNodeDatum; - }) - }; -} diff --git a/src/handbook/src/backend/events.ts b/src/handbook/src/backend/events.ts deleted file mode 100644 index 7c38f7eac..000000000 --- a/src/handbook/src/backend/events.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { EventEmitter } from "events"; - -import type { Page } from "@backend/types"; -import { isPage } from "@backend/types"; - -const emitter = new EventEmitter(); -const navigation = new EventEmitter(); - -let navStack: Page[] = []; -let currentPage: number | null = -1; - -/** - * Sets up the event system. - */ -export function setup(): void { - window.onpopstate = (event) => { - navigate(event.state, false); - }; - - setTimeout(() => { - // Check if the window's href is a page. - const page = window.location.href.split("/").pop(); - if (page == undefined || page == "") return; - - // Convert the page to a Page type. - const pageName = page.charAt(0).toUpperCase() + page.slice(1); - const pageType = pageName as Page; - - // Navigate to the page. - isPage(page) && navigate(pageType, false); - }, 3e2); -} - -/** - * Adds a navigation listener. - * - * @param listener The listener to add. - */ -export function addNavListener(listener: (page: Page) => void) { - navigation.on("navigate", listener); -} - -/** - * Removes a navigation listener. - * - * @param listener The listener to remove. - */ -export function removeNavListener(listener: (page: Page) => void) { - navigation.off("navigate", listener); -} - -/** - * Navigates to a page. - * Returns the last page. - * - * @param page The page to navigate to. - * @param update Whether to update the state or not. - */ -export function navigate(page: Page, update: boolean = true): Page | null { - // Check the page. - if (page == undefined) page = "Home"; - - // Navigate to the new page. - const lastPage = currentPage; - navigation.emit("navigate", page); - - if (update) { - // Set the current page. - navStack.push(page); - currentPage = navStack.length - 1; - // Add the page to the window history. - window.history.pushState(page, page, "/" + page.toLowerCase()); - } - - return lastPage ? navStack[lastPage] : null; -} - -/** - * Goes back or forward in the navigation stack. - * - * @param forward Whether to go forward or not. - */ -export function go(forward: boolean): void { - if (currentPage == undefined) return; - - // Get the new page. - const newPage = forward ? currentPage + 1 : currentPage - 1; - if (newPage < 0 || newPage >= navStack.length) return; - - // Navigate to the new page. - currentPage = newPage; - navigation.emit("navigate", navStack[newPage]); - - // Update the window history. - window.history.pushState(navStack[newPage], navStack[newPage], "/" + navStack[newPage].toLowerCase()); -} - -// This is the global event system. -export default emitter; -// @ts-ignore -window["emitter"] = emitter; -// @ts-ignore -window["navigate"] = navigate; diff --git a/src/handbook/src/backend/files.d.ts b/src/handbook/src/backend/files.d.ts deleted file mode 100644 index ac11472da..000000000 --- a/src/handbook/src/backend/files.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -declare module "*.svg" { - export const ReactComponent: React.FunctionComponent>; -} - -declare module "*.webp" { - const ref: string; - export default ref; -} - -declare module "*.csv" { - const content: any[]; - export default content; -} diff --git a/src/handbook/src/backend/server.ts b/src/handbook/src/backend/server.ts deleted file mode 100644 index 309ceac97..000000000 --- a/src/handbook/src/backend/server.ts +++ /dev/null @@ -1,198 +0,0 @@ -import type { CommandResponse } from "@backend/types"; -import emitter from "@backend/events"; - -import { getWindowDetails } from "@app/utils"; - -let playerToken: string | null = null; // The session token for the player. -export let targetPlayer = 0; // The UID of the target player. - -// The server's address and port. -export let address: string = getWindowDetails().address, - port: string = getWindowDetails().port.toString(); -export let encrypted: boolean = true; - -export let lockedPlayer = false; // Whether the UID field is locked. -export let connected = false; // Whether the server is connected. - -/** - * Loads the server details from local storage. - */ -export function setup(): void { - // Check if the server is disabled. - if (getWindowDetails().disable) return; - - // Load the server details from local storage. - const storedAddress = localStorage.getItem("address"); - const storedPort = localStorage.getItem("port"); - - // Set the server details. - if (storedAddress) address = storedAddress; - if (storedPort) port = storedPort; -} - -/** - * Returns the formed URL. - * This assumes that the server upgrades to HTTPS. - */ -export function url(): string { - // noinspection HttpUrlsUsage - return `http${window.isSecureContext || encrypted ? "s" : ""}://${address}:${port}`; -} - -/** - * Sets the target player. - * - * @param player The UID of the target player. - * @param token The session token for the player. - */ -export function setTargetPlayer(player: number, token: string | null = null): void { - playerToken = token; - targetPlayer = player; - - // Determine connected status. - connected = !isNaN(player) && player > 0; - // Determine locked status. - lockedPlayer = connected && token != null; - - // Emit the connected event. - emitter.emit("connected", connected); -} - -/** - * Sets the server details. - * - * @param newAddress The server's address. - * @param newPort The server's port. - */ -export async function setServerDetails(newAddress: string | null, newPort: string | number | null): Promise { - if (!getWindowDetails().disable) { - if (typeof newPort == "number") newPort = newPort.toString(); - - // Apply the new details. - if (newAddress != null) { - address = newAddress; - localStorage.setItem("address", newAddress); - } - if (newPort != null) { - port = newPort; - localStorage.setItem("port", newPort); - } - } - - // Check if the server is encrypted. - return new Promise((resolve) => { - encrypted = true; - fetch(`${url()}`) - .catch(() => { - encrypted = false; - resolve(); - }) - .then(() => resolve()); - }); -} - -/** - * Validates a number. - * - * @param value The number to validate. - */ -function invalid(value: number): boolean { - return isNaN(value) || value < 0; -} - -/** - * Grants an avatar to a player. - * - * @param avatar The avatar's ID. - * @param level The avatar's level. - * @param constellations The avatar's unlocked constellations. - * @param talents The level for the avatar's talents. - */ -export async function grantAvatar( - avatar: number, - level = 90, - constellations = 6, - talents = 10 -): Promise { - // Validate the numbers. - if (invalid(avatar) || invalid(level) || invalid(constellations) || invalid(talents)) - return { status: -1, message: "Invalid arguments." }; - - return await fetch(`${url()}/handbook/avatar`, { - method: "POST", - body: JSON.stringify({ - playerToken, - player: targetPlayer.toString(), - avatar: avatar.toString(), - level, - constellations, - talentLevels: talents - }) - }).then((res) => res.json()); -} - -/** - * Gives an item to the player. - * This does not support weapons. - * This does not support relics. - * - * @param item The item's ID. - * @param amount The amount of the item to give. - */ -export async function giveItem(item: number, amount = 1): Promise { - // Validate the number. - if (isNaN(amount) || amount < 1) return { status: -1, message: "Invalid amount." }; - - return await fetch(`${url()}/handbook/item`, { - method: "POST", - body: JSON.stringify({ - playerToken, - player: targetPlayer.toString(), - item: item.toString(), - amount - }) - }).then((res) => res.json()); -} - -/** - * Teleports the player to a new scene. - * - * @param scene The scene's ID. - */ -export async function teleportTo(scene: number): Promise { - // Validate the number. - if (isNaN(scene) || scene < 1) return { status: -1, message: "Invalid scene." }; - - return await fetch(`${url()}/handbook/teleport`, { - method: "POST", - body: JSON.stringify({ - playerToken, - player: targetPlayer.toString(), - scene: scene.toString() - }) - }).then((res) => res.json()); -} - -/** - * Spawns an entity. - * - * @param entity The entity's ID. - * @param amount The amount of the entity to spawn. - * @param level The level of the entity to spawn. - */ -export async function spawnEntity(entity: number, amount = 1, level = 1): Promise { - // Validate the numbers. - if (isNaN(entity) || isNaN(amount) || isNaN(level) || amount < 1 || level < 1 || level > 200) - return { status: -1, message: "Invalid arguments." }; - - return await fetch(`${url()}/handbook/spawn`, { - method: "POST", - body: JSON.stringify({ - playerToken, - player: targetPlayer.toString(), - entity: entity.toString(), - amount, - level - }) - }).then((res) => res.json()); -} diff --git a/src/handbook/src/backend/types.ts b/src/handbook/src/backend/types.ts deleted file mode 100644 index dafce45a9..000000000 --- a/src/handbook/src/backend/types.ts +++ /dev/null @@ -1,177 +0,0 @@ -export type Page = "Home" | "Commands" | "Avatars" | "Items" | "Entities" | "Scenes" | "Quests" | "Achievements"; -export type Overlays = "None" | "ServerSettings"; -export type Days = "Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday"; - -export type MainQuest = { - id: number; - title: string; -}; - -export type Command = { - name: string[]; - description: string; - usage: string[]; - permission: string[]; - target: Target; -}; - -export type Avatar = { - name: string; - quality: Quality; - id: number; -}; - -export type Scene = { - identifier: string; - type: SceneType; - id: number; -}; - -export type Item = { - id: number; - name: string; - quality: Quality; - type: ItemType; - icon: string; -}; - -export type Entity = { - id: number; - name: string; - internal: string; -}; - -export type Quest = { - id: number; - description: string; - mainId: number; -}; - -// Exported from Project Amber. -export type ItemInfo = { - response: number | 200 | 404; - data: { - name: string; - description: string; - type: string; - recipe: boolean; - mapMark: boolean; - source: { - name: string; - type: string | "domain"; - days: Days; - }[]; - icon: string; - rank: 1 | 2 | 3 | 4 | 5; - route: string; - }; -}; - -// Exported from Project Amber. -export type EntityInfo = { - response: number | 200 | 404; - data: { - id: number; - name: string; - type: string; - icon: string; - route: string; - title: string; - specialName: string; - description: string; - entries: any[]; - tips: null; - }; -}; - -export enum Target { - None = "NONE", - Offline = "OFFLINE", - Player = "PLAYER", - Online = "ONLINE" -} - -export enum Quality { - Legendary = "LEGENDARY", - Epic = "EPIC", - Rare = "RARE", - Uncommon = "UNCOMMON", - Common = "COMMON", - Unknown = "UNKNOWN" -} - -export enum ItemType { - None = "ITEM_NONE", - Virtual = "ITEM_VIRTUAL", - Material = "ITEM_MATERIAL", - Reliquary = "ITEM_RELIQUARY", - Weapon = "ITEM_WEAPON", - Display = "ITEM_DISPLAY", - Furniture = "ITEM_FURNITURE" -} - -export enum SceneType { - None = "SCENE_NONE", - World = "SCENE_WORLD", - Dungeon = "SCENE_DUNGEON", - Room = "SCENE_ROOM", - HomeWorld = "SCENE_HOME_WORLD", - HomeRoom = "SCENE_HOME_ROOM", - Activity = "SCENE_ACTIVITY" -} - -export enum ItemCategory { - Constellation, - Avatar, - Weapon, - Artifact, - Furniture, - Material, - Miscellaneous -} - -export type CommandResponse = { - status: number | 200 | 500; - message: string; -}; - -export type WindowDetails = { - address: string; - port: number; - disable: boolean; -}; - -/** - * Checks if a string is a page. - * - * @param page The string to check. - */ -export function isPage(page: string): page is Page { - return ["Home", "Commands", "Avatars", "Items", "Entities", "Scenes"].includes(page); -} - -/** - * Converts an item type to a string. - * - * @param type The item type to convert. - */ -export function itemTypeToString(type: ItemType): string { - switch (type) { - default: - return "Unknown"; - case ItemType.None: - return "None"; - case ItemType.Virtual: - return "Virtual"; - case ItemType.Material: - return "Material"; - case ItemType.Reliquary: - return "Reliquary"; - case ItemType.Weapon: - return "Weapon"; - case ItemType.Display: - return "Display"; - case ItemType.Furniture: - return "Furniture"; - } -} diff --git a/src/handbook/src/css/App.scss b/src/handbook/src/css/App.scss deleted file mode 100644 index 1c0c682a9..000000000 --- a/src/handbook/src/css/App.scss +++ /dev/null @@ -1,88 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@font-face { - font-family: 'Poppins'; - src: url('/data/assets/Poppins-Regular.ttf') -} - -html { - --background-color: #25294a; - --primary-color: #2d325a; - --secondary-color: #202442; - --accent-color: #4b5396; - - --text-primary-color: #FFFFFF; - --unselected-color: #c7c8d0; - --selected-color: #FFFFFF; - - --legendary-color: #926d45; - --epic-color: #7b5c90; - - // pq = Primary Quest - --pq-bg: #333d49; - --pq-text: #d3bc8e; - --pq-text2: #8c836f; - - --quest-unselected: #4e5765; - --quest-selected: #ede5da; - --quest-accent: #9b927d; - - // qt = Quest Text - --qt-unselected: #ede5da; - --qt2-unselected: #8e9295; - --qt-selected: #4d5568; - --qt2-selected: #a6a5a7; - - overflow: hidden; -} - -body { - margin: 0; - padding: 0; - height: 100vh; - width: 100%; - overflow: hidden; - background-color: var(--background-color); - - #root { - height: 100%; - width: 100%; - } - - * { - font-family: 'SDK_SC_Web', 'SDK_JP_Web', 'Poppins', sans-serif; - } - - svg:focus { - outline: none; - } -} - -.App { - display: flex; - flex-direction: row; - - width: 100%; - height: 100%; -} - -button { - background-color: transparent; - border: none; - cursor: pointer; -} - -::-webkit-scrollbar { - width: 5px; -} - -::-webkit-scrollbar-track { - background: transparent; -} - -::-webkit-scrollbar-thumb { - background: var(--accent-color); - border-radius: 10px; -} diff --git a/src/handbook/src/css/Text.scss b/src/handbook/src/css/Text.scss deleted file mode 100644 index 5eae1e523..000000000 --- a/src/handbook/src/css/Text.scss +++ /dev/null @@ -1,28 +0,0 @@ -p { - color: var(--text-primary-color); - margin: 0; -} - -h1 { - color: var(--text-primary-color); - font-style: normal; - font-weight: normal; - font-size: 48px; - margin: 0; -} - -h2 { - color: var(--text-primary-color); - font-style: normal; - font-weight: 600; - font-size: 24px; - margin: 0; -} - -h3 { - color: var(--text-primary-color); - font-style: normal; - font-weight: 600; - font-size: 18px; - margin: 0; -} diff --git a/src/handbook/src/css/components/VirtualizedGrid.scss b/src/handbook/src/css/components/VirtualizedGrid.scss deleted file mode 100644 index 44b569499..000000000 --- a/src/handbook/src/css/components/VirtualizedGrid.scss +++ /dev/null @@ -1,4 +0,0 @@ -.GridRow { - display: flex; - flex-direction: row; -} diff --git a/src/handbook/src/css/pages/AvatarsPage.scss b/src/handbook/src/css/pages/AvatarsPage.scss deleted file mode 100644 index 810f66729..000000000 --- a/src/handbook/src/css/pages/AvatarsPage.scss +++ /dev/null @@ -1,31 +0,0 @@ -.AvatarsPage { - display: flex; - width: calc(100% - 352px); - - background-color: var(--background-color); - flex-direction: column; - - padding: 24px; - - overflow-y: scroll; -} - -.AvatarsPage_Title { - max-width: 275px; - max-height: 60px; - - font-size: 48px; - font-weight: bold; - text-align: center; - - margin-bottom: 30px; -} - -.AvatarsPage_List { - display: flex; - flex-direction: row; - flex-wrap: wrap; - gap: 15px; - - max-width: 90%; -} diff --git a/src/handbook/src/css/pages/CommandsPage.scss b/src/handbook/src/css/pages/CommandsPage.scss deleted file mode 100644 index 147a20b1a..000000000 --- a/src/handbook/src/css/pages/CommandsPage.scss +++ /dev/null @@ -1,30 +0,0 @@ -.CommandsPage { - display: flex; - height: 100%; - width: 100%; - - background-color: var(--background-color); - flex-direction: column; - - padding: 24px; -} - -.CommandsPage_Title { - max-width: 275px; - max-height: 60px; - - font-size: 48px; - font-weight: bold; - text-align: center; - - margin-bottom: 30px; -} - -.CommandsPage_List { - display: flex; - flex-direction: column; - - gap: 15px; - margin-bottom: 28px; - overflow-y: scroll; -} diff --git a/src/handbook/src/css/pages/EntitiesPage.scss b/src/handbook/src/css/pages/EntitiesPage.scss deleted file mode 100644 index 2e5a43b3b..000000000 --- a/src/handbook/src/css/pages/EntitiesPage.scss +++ /dev/null @@ -1,93 +0,0 @@ -.EntitiesPage { - display: flex; - height: 100%; - width: 100%; - - flex-direction: row; - justify-content: space-between; - background-color: var(--background-color); - - padding: 24px; -} - -.EntitiesPage_Content { - display: flex; - flex-direction: column; - - width: 80%; -} - -.EntitiesPage_Header { - display: flex; - flex-direction: row; - - gap: 30px; - align-content: center; - - margin-bottom: 30px; -} - -.EntitiesPage_Title { - max-width: 230px; - max-height: 60px; - - font-size: 48px; - font-weight: bold; - text-align: center; - justify-content: center; -} - -.EntitiesPage_Search { - display: flex; - - width: 100%; - height: 100%; - max-width: 465px; - max-height: 60px; - - box-sizing: border-box; - align-items: center; - border-radius: 10px; - - background-color: var(--primary-color); -} - -.EntitiesPage_Input { - background: none; - border: none; - - color: var(--text-primary-color); - font-size: 20px; - width: 100%; - padding: 11px; - - &:focus, &:active { - outline: none; - } -} - -.EntitiesPage_Input::placeholder { - color: var(--text-secondary-color); - opacity: 1; -} - -.EntitiesPage_List { - display: grid; - gap: 15px 15px; - - grid-template-columns: repeat(15, 100px); - - margin-bottom: 28px; - overflow-y: scroll; -} - -.EntitiesPage_Card { - display: flex; - - width: 100%; - max-width: 300px; - min-height: 300px; - max-height: 700px; - - align-self: center; -} diff --git a/src/handbook/src/css/pages/HomePage.scss b/src/handbook/src/css/pages/HomePage.scss deleted file mode 100644 index 68b0b58db..000000000 --- a/src/handbook/src/css/pages/HomePage.scss +++ /dev/null @@ -1,147 +0,0 @@ -.HomePage { - height: 100%; - width: 100%; - overflow-y: scroll; - padding: 0; - - display:flex; - flex-direction: column; - justify-content: space-between; - gap: 50px; - - background-color: var(--background-color); - - div { - display: flex; - } -} - -.HomePage_Top { - display: flex; - width: 100%; - - flex-direction: column; - align-items: center; - - gap: 24px; -} - -.HomePage_Title { - margin-top: 31px; - margin-bottom: 15px; -} - -.HomePage_Buttons { - width: 100%; - - max-width: 1376px; - - gap: 24px; - justify-content: center; - flex-wrap: wrap; -} - -.HomePage_Bottom { - display: flex; - flex-direction: row; - justify-content: space-between; - margin-bottom: 50px; -} - -.HomePage_Box { - display: flex; - background-color: var(--primary-color); -} - -.HomePage_Disclaimer { - display: flex; - flex-direction: row; - gap: 30px; - background-color: var(--primary-color); - - height: 100px; - align-self: end; - - margin: 0 0 0 60px; - border-radius: 10px; - - box-sizing: border-box; - padding: 11px; - - p { - font-size: 16px; - } -} - -.HomePage_Discord { - max-width: 150px; - padding: 10px; - border-radius: 10px; - - gap: 8px; - align-self: center; - align-items: center; - - svg { - width: 100%; - height: 100%; - max-width: 44px; - max-height: 30px; - } - - p { - font-size: 16px; - } - - &:hover { - cursor: pointer; - background-color: #5865F2; - box-shadow: 0 0 10px 0 rgba(0,0,0,0.75); - } -} - -.HomePage_Text { - display: flex; - flex-direction: column; - gap: 10px; - background-color: var(--primary-color); - - max-width: 300px; - - margin: 13px 60px 0 0; - border-radius: 10px; - - box-sizing: border-box; - padding: 11px; -} - -.HomePage_Credits { - display: flex; - flex-direction: row; - gap: 5px; - - :nth-child(1) { - font-size: 18px; - font-weight: bold; - } - - :nth-child(2) { - font-size: 10px; - align-self: center; - } -} - -.HomePage_Links { - display: flex; - flex-direction: column; - - a { - color: var(--text-primary-color); - text-decoration: none; - padding-right: 10px; - - &:hover { - text-decoration: underline; - } - } -} diff --git a/src/handbook/src/css/pages/ItemsPage.scss b/src/handbook/src/css/pages/ItemsPage.scss deleted file mode 100644 index 7fc11c6d0..000000000 --- a/src/handbook/src/css/pages/ItemsPage.scss +++ /dev/null @@ -1,88 +0,0 @@ -.ItemsPage { - display: flex; - height: 100%; - width: 100%; - - flex-direction: row; - justify-content: space-between; - background-color: var(--background-color); - - padding: 24px; -} - -.ItemsPage_Content { - display: flex; - flex-direction: column; - - width: 80%; -} - -.ItemsPage_Header { - display: flex; - flex-direction: row; - - gap: 30px; - align-content: center; - - margin-bottom: 30px; -} - -.ItemsPage_Title { - max-width: 130px; - max-height: 60px; - - font-size: 48px; - font-weight: bold; - text-align: center; - justify-content: center; -} - -.ItemsPage_Search { - display: flex; - - width: 100%; - height: 100%; - max-width: 465px; - max-height: 60px; - - box-sizing: border-box; - align-items: center; - border-radius: 10px; - - background-color: var(--primary-color); -} - -.ItemsPage_Input { - background-color: transparent; - border: none; - - color: var(--text-primary-color); - font-size: 20px; - width: 100%; - padding: 11px; - - &:focus, &:active { - outline: none; - } -} - -.ItemsPage_Input::placeholder { - color: var(--text-secondary-color); - opacity: 1; -} - -.ItemsPage_List { - margin-bottom: 28px; - overflow-y: scroll; -} - -.ItemsPage_Card { - display: flex; - - width: 100%; - max-width: 300px; - min-height: 300px; - max-height: 700px; - - align-self: center; -} diff --git a/src/handbook/src/css/pages/QuestsPage.scss b/src/handbook/src/css/pages/QuestsPage.scss deleted file mode 100644 index 170bd655a..000000000 --- a/src/handbook/src/css/pages/QuestsPage.scss +++ /dev/null @@ -1,14 +0,0 @@ -.QuestsPage { - display: flex; - justify-content: space-between; - - width: 100%; - height: 100%; -} - -.QuestsPage_Selector { - display: flex; - - width: 50%; - height: 100%; -} diff --git a/src/handbook/src/css/pages/ScenesPage.scss b/src/handbook/src/css/pages/ScenesPage.scss deleted file mode 100644 index 1b3d63097..000000000 --- a/src/handbook/src/css/pages/ScenesPage.scss +++ /dev/null @@ -1,56 +0,0 @@ -.ScenesPage { - display: flex; - height: 100%; - width: 100%; - - background-color: var(--background-color); - flex-direction: column; - - padding: 24px; -} - -.ScenesPage_Title { - max-width: 180px; - max-height: 60px; - - font-size: 48px; - font-weight: bold; - text-align: center; - - margin-bottom: 30px; -} - -.ScenesPage_List { - display: flex; - flex-direction: column; - - gap: 15px; - margin-bottom: 28px; - overflow-y: scroll; -} - -.ScenesPage_Button { - width: 94px; - height: 34px; - - margin: 0; - border-radius: 10px; - border: transparent; - - font-size: 20px; - - color: var(--text-primary-color); - background-color: var(--background-color); - - user-select: none; - - transition: 0.1s ease-in-out all; -} - -.ScenesPage_Button:hover { - cursor: pointer; -} - -.ScenesPage_Button:active { - scale: 0.9; -} diff --git a/src/handbook/src/css/views/Content.scss b/src/handbook/src/css/views/Content.scss deleted file mode 100644 index 2a2abba8b..000000000 --- a/src/handbook/src/css/views/Content.scss +++ /dev/null @@ -1,4 +0,0 @@ -.Content { - width: 100%; - height: 100%; -} diff --git a/src/handbook/src/css/views/Overlay.scss b/src/handbook/src/css/views/Overlay.scss deleted file mode 100644 index 2169a0b8a..000000000 --- a/src/handbook/src/css/views/Overlay.scss +++ /dev/null @@ -1,12 +0,0 @@ -.Overlay { - display: flex; - position: absolute; - - justify-content: center; - align-items: center; - - width: 100vw; - height: 100vh; - - background-color: rgb(0, 0, 0, 0.35); -} diff --git a/src/handbook/src/css/views/PlainText.scss b/src/handbook/src/css/views/PlainText.scss deleted file mode 100644 index 29b4336a1..000000000 --- a/src/handbook/src/css/views/PlainText.scss +++ /dev/null @@ -1,9 +0,0 @@ -.PlainText { - margin: 12px 5px 0 12px; - overflow-y: scroll; - overflow-x: scroll; - - p { - color: white; - } -} diff --git a/src/handbook/src/css/views/SideBar.scss b/src/handbook/src/css/views/SideBar.scss deleted file mode 100644 index d2b51bd95..000000000 --- a/src/handbook/src/css/views/SideBar.scss +++ /dev/null @@ -1,80 +0,0 @@ -.SideBar { - display: flex; - flex-direction: column; - - height: 100%; - width: 100%; - max-width: 300px; - - background-color: var(--secondary-color); - - gap: 40px; -} - -.SideBar_Title { - margin-top: 42px; - line-height: 41px; - font-size: 34px; - - max-width: 256px; - max-height: 128px; - text-align: center; - align-self: center; - - user-select: none; -} - -.SideBar_Title:hover { - cursor: pointer; -} - -.SideBar_Buttons { - display: flex; - flex-direction: column; - - gap: 15px; - - user-select: none; -} - -.SideBar_Enter { - display: flex; - - width: 100%; - height: 100%; - max-width: 250px; - max-height: 50px; - margin-bottom: 24px; - - box-sizing: border-box; - align-self: center; - align-items: center; - border-radius: 10px; - - background-color: var(--background-color); -} - -.SideBar_Input { - background-color: transparent; - border: none; - - color: var(--text-primary-color); - font-size: 20px; - width: 100%; - padding: 11px; - - &:focus, &:active { - outline: none; - } -} - -.SideBar_Input::placeholder { - color: var(--text-secondary-color); - opacity: 1; -} - -.SideBar_Input:disabled { - cursor: not-allowed; - border-radius: 10px ; - background-color: var(--background-color); -} diff --git a/src/handbook/src/css/widgets/Card.scss b/src/handbook/src/css/widgets/Card.scss deleted file mode 100644 index 8ccca3fe2..000000000 --- a/src/handbook/src/css/widgets/Card.scss +++ /dev/null @@ -1,53 +0,0 @@ -.Card { - display: flex; - flex-direction: row; - justify-content: space-between; - - width: 100%; - max-width: 1510px; - - border-radius: 15px; - padding: 10px; - box-sizing: border-box; - - background-color: var(--primary-color); -} - -.Card_Content { - display: flex; - flex-direction: column; - justify-content: space-between; -} - -.Card_Header { - display: flex; - flex-direction: row; - - width: 100%; - height: 100%; - - gap: 15px; - align-items: center; -} - -.Card_Title { - font-size: 32px; - font-weight: bold; -} - -.Card_Alternate { - font-size: 24px; -} - -.Card_Description { - color: var(--text-primary-color); - padding-bottom: 5px; -} - -.Card_Button { - display: flex; - margin-right: 13px; - - align-self: center; - justify-content: center; -} diff --git a/src/handbook/src/css/widgets/Character.scss b/src/handbook/src/css/widgets/Character.scss deleted file mode 100644 index 93139007a..000000000 --- a/src/handbook/src/css/widgets/Character.scss +++ /dev/null @@ -1,47 +0,0 @@ -.Character { - display: flex; - flex-direction: column; - - max-width: 96px; - max-height: 135px; - border-radius: 15px; - - height: 100%; - width: 100%; - - overflow: hidden; - box-sizing: border-box; - - &:hover { - cursor: pointer; - transition: 0.1s ease-in-out all; - box-shadow: 0 0 10px 5px var(--primary-color); - } -} - -.Character :hover { - cursor: pointer; -} - -.Character_Icon { - width: 96px; - height: 96px; - - align-self: center; -} - -.Character_Label { - display: flex; - justify-content: center; - align-items: center; - - background-color: var(--primary-color); - - max-width: 100px; - height: 40px; - - p { - text-align: center; - margin: 4px; - } -} diff --git a/src/handbook/src/css/widgets/HomeButton.scss b/src/handbook/src/css/widgets/HomeButton.scss deleted file mode 100644 index af71886f4..000000000 --- a/src/handbook/src/css/widgets/HomeButton.scss +++ /dev/null @@ -1,46 +0,0 @@ -.HomeButton { - display: flex; - flex-direction: column; - padding: 20px; - - width: min(10vw, 196px); - height: min(20vh, 196px); - - background-color: var(--primary-color); - - align-items: center; - justify-content: center; - gap: 20px; - - border-radius: 10px; - user-select: none; - - &:hover { - cursor: pointer; - box-shadow: 0 0 10px 5px var(--accent-color); - scale: 1.01; - } - - transition: 0.1s ease-in-out all; -} - -.HomeButton:hover { - cursor: pointer; - transition: 0.1s ease-in-out all; - - &:hover { - cursor: pointer; - box-shadow: 0 0 10px 5px var(--primary-color); - scale: 1.01; - } -} - -.HomeButton_Icon { - max-width: 128px; - max-height: 128px; -} - -.HomeButton_Label { - font-size: min(1.3vw, 30px); - text-align: center; -} diff --git a/src/handbook/src/css/widgets/MiniCard.scss b/src/handbook/src/css/widgets/MiniCard.scss deleted file mode 100644 index 8d200465f..000000000 --- a/src/handbook/src/css/widgets/MiniCard.scss +++ /dev/null @@ -1,47 +0,0 @@ -.MiniCard { - display: flex; - - width: 64px; - height: 64px; - - overflow: hidden; - justify-content: center; - - transition: 0.1s ease-in-out all; - - &:hover { - cursor: pointer; - filter: brightness(0.9); - } -} - -.MiniCard_Background { - display: flex; - align-items: center; - - max-width: 64px; - max-height: 64px; - - border-radius: 10px; - background-color: var(--primary-color); -} - -.MiniCard_Icon { - max-width: 64px; - max-height: 64px; - object-fit: scale-down; - border-radius: 10px; -} - -.MiniCard_Label { - width: 64px; - max-height: 64px; - text-align: center; - font-size: 12px; - color: var(--text-primary-color); -} - -.MiniCard_Info { - position: absolute; - display: flex; -} diff --git a/src/handbook/src/css/widgets/ObjectCard.scss b/src/handbook/src/css/widgets/ObjectCard.scss deleted file mode 100644 index e962db2e2..000000000 --- a/src/handbook/src/css/widgets/ObjectCard.scss +++ /dev/null @@ -1,160 +0,0 @@ -.ObjectCard { - display: flex; - flex-direction: column; - justify-content: space-between; - - width: 100%; - height: 100%; - max-width: 300px; - min-height: 300px; - max-height: 700px; - - padding: 20px; - box-sizing: border-box; - - border-radius: 10px; - background-color: var(--primary-color); -} - -.ObjectCard_Content { - display: flex; - gap: 10px; - - flex-direction: column; -} - -.ObjectCard_Header { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.ObjectCard_Info { - display: flex; - flex-direction: column; - gap: 10px; - - :nth-child(1) { - font-weight: bold; - font-size: 20px; - - max-width: 170px; - max-height: 60px; - - color: var(--text-primary-color); - } - - :nth-child(2) { - font-size: 16px; - - color: var(--text-primary-color); - } -} - -.ObjectCard_Icon { - width: 64px; - height: 64px -} - -.ObjectCard_Description { - display: flex; - flex-direction: column; - overflow-y: scroll; - - max-width: 250px; - max-height: 460px; - - p { - font-size: 14px; - - color: var(--text-primary-color); - } -} - -.ObjectCard_Actions { - display: flex; - flex-direction: column; - - gap: 5px; - padding-top: 10px; -} - -.ObjectCard_Counter { - display: flex; - flex-direction: row; - justify-content: space-between; - - width: 100%; - height: 100%; - max-width: 260px; - max-height: 46px; - - border-radius: 10px; - padding: 0 13px 0 13px; - box-sizing: border-box; - - align-items: center; - background-color: var(--secondary-color); -} - -.ObjectCard_Operation { - user-select: none; - display: flex; - - width: 30px; - height: 20px; - - font-size: 24px; - align-items: center; - justify-content: center; - color: var(--text-primary-color); - - background-color: var(--background-color); -} - -.ObjectCard_Operation:hover { - cursor: pointer; -} - -.ObjectCard_Count { - max-width: 105px; - height: 48px; - - font-size: 24px; - text-align: center; - background-color: transparent; - color: var(--text-primary-color); - border: transparent; -} - -.ObjectCard_Count:focus { - outline: none; -} - -.ObjectCard_Submit { - width: 100%; - height: 46px; - max-width: 260px; - - border-radius: 10px; - text-align: center; - justify-content: center; - - border: transparent; - font-size: 24px; - - color: var(--text-primary-color); - background-color: var(--secondary-color); - - user-select: none; - transition: 0.1s ease-in-out all; -} - -.ObjectCard_Submit:hover { - cursor: pointer; - scale: 1.05; -} - -.ObjectCard_Submit:active { - scale: 0.9; -} diff --git a/src/handbook/src/css/widgets/ServerSettings.scss b/src/handbook/src/css/widgets/ServerSettings.scss deleted file mode 100644 index f763733e4..000000000 --- a/src/handbook/src/css/widgets/ServerSettings.scss +++ /dev/null @@ -1,117 +0,0 @@ -.ServerSettings { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - border-radius: 10px; - - background-color: var(--primary-color); - - width: 100%; - height: 100%; - max-width: 620px; - max-height: 400px; - - padding: 10px; - box-sizing: border-box; -} - -.ServerSettings_Content { - display: flex; - align-items: center; - flex-direction: column; - - width: 100%; - - gap: 15px; -} - -.ServerSettings_Top { - height: 80%; -} - -.ServerSettings_Frame { - width: 100%; - height: 100%; - - border: 0; -} - -.ServerSettings_Title { - font-weight: bold; - font-size: 34px; - - text-align: center; - margin-bottom: 15px; - user-select: none; -} - -.ServerSettings_Details { - display: flex; - flex-direction: row; - justify-content: space-between; - - border-radius: 10px; - background-color: var(--secondary-color); - - width: 100%; - height: 100%; - max-width: 590px; - max-height: 50px; - - padding: 10px; - box-sizing: border-box; - - p { - font-size: 20px; - user-select: none; - } - - div { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - - gap: 5px; - } - - input { - border: none; - background: none; - - font-size: 18px; - color: var(--text-primary-color); - - &:focus, &:active { - outline: none; - } - } -} - -.ServerSettings_Authenticate { - font-size: 20px; - border-radius: 10px; - background-color: var(--secondary-color); - - width: 100%; - height: 100%; - max-width: 210px; - max-height: 46px; - - cursor: pointer; - color: white; -} - -.ServerSettings_Save { - font-size: 20px; - border-radius: 10px; - background-color: var(--secondary-color); - - width: 100%; - height: 46px; - max-width: 120px; - - cursor: pointer; - color: white; -} diff --git a/src/handbook/src/css/widgets/SideBarButton.scss b/src/handbook/src/css/widgets/SideBarButton.scss deleted file mode 100644 index 318f2e1df..000000000 --- a/src/handbook/src/css/widgets/SideBarButton.scss +++ /dev/null @@ -1,31 +0,0 @@ -.SideBarButton { - display: flex; - flex-direction: row; - - gap: 15px; - padding-left: 27px; - - height: 64px; - - align-items: center; - - &:hover { - cursor: pointer; - backdrop-filter: brightness(0.9); - } - - transition: 0.2s ease-in-out all; -} - -.SideBarButton_Icon { - max-width: 64px; - max-height: 64px; -} - -.SideBarButton_Label { - font-size: 22px; - line-height: 29px; - font-style: normal; - - max-width: 220px; -} diff --git a/src/handbook/src/css/widgets/quest/NormalQuest.scss b/src/handbook/src/css/widgets/quest/NormalQuest.scss deleted file mode 100644 index 1050290ac..000000000 --- a/src/handbook/src/css/widgets/quest/NormalQuest.scss +++ /dev/null @@ -1,54 +0,0 @@ -.NormalQuest { - display: flex; - align-items: center; - justify-content: space-between; - - width: 431px; - height: 100%; - - min-width: 100px; - min-height: 25px; - max-height: 53px; - - background-color: var(--quest-unselected); - padding: 11px 20px 11px 20px; - box-sizing: border-box; - - p { - user-select: none; - cursor: pointer; - } -} - -.NormalQuest[datatype="right"] { - margin-left: auto; - margin-right: 0; -} - -.NormalQuest:hover { - background-color: var(--quest-selected); - - p { - color: var(--qt-selected); - } -} - -.NormalQuest_Info { - display: flex; - flex-direction: column; - - :nth-child(1) { - font-size: 16px; - color: var(--qt-unselected); - } - - :nth-child(2) { - font-size: 13px; - color: var(--qt2-unselected); - } -} - -.NormalQuest_Icon { - font-size: 16px; - color: var(--quest-accent); -} diff --git a/src/handbook/src/css/widgets/quest/PrimaryQuest.scss b/src/handbook/src/css/widgets/quest/PrimaryQuest.scss deleted file mode 100644 index 7f51d322b..000000000 --- a/src/handbook/src/css/widgets/quest/PrimaryQuest.scss +++ /dev/null @@ -1,65 +0,0 @@ -.PrimaryQuest { - display: flex; - flex-direction: column; - - height: min-content; -} - -.PrimaryQuest_List { - display: flex; - flex-direction: column; - - width: 97%; - margin-left: auto; - margin-right: 5px; - - gap: 8px; - padding: 8px 8px 8px 8px; - background-color: var(--primary-color); -} - -/* Trigger related CSS. */ - -.Trigger { - display: flex; - flex-direction: row; - - gap: 10px; - padding: 10px 10px 10px 10px; - box-sizing: border-box; - - width: 461px; - height: 100%; - min-width: 100px; - min-height: 25px; - max-height: 60px; - - background-color: var(--pq-bg); - - p { - user-select: none; - cursor: pointer; - } -} - -.Trigger_Icon { - font-size: 20px; - padding-top: 5px; - - color: var(--pq-text); -} - -.Trigger_Info { - display: flex; - flex-direction: column; - - :nth-child(1) { - font-size: 16px; - color: var(--pq-text); - } - - :nth-child(2) { - font-size: 14px; - color: var(--pq-text2); - } -} diff --git a/src/handbook/src/icons/discord.svg b/src/handbook/src/icons/discord.svg deleted file mode 100644 index 22ee27ba2..000000000 --- a/src/handbook/src/icons/discord.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/handbook/src/main.tsx b/src/handbook/src/main.tsx deleted file mode 100644 index 91db20e49..000000000 --- a/src/handbook/src/main.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import { createRoot } from "react-dom/client"; - -import * as data from "@backend/data"; -import * as events from "@backend/events"; -import * as server from "@backend/server"; - -import App from "@ui/App"; - -// Call initial setup functions. -data.setup(); -events.setup(); -server.setup(); - -// Render the application. -createRoot(document.getElementById("root") as HTMLElement).render( - - - -); diff --git a/src/handbook/src/ui/App.tsx b/src/handbook/src/ui/App.tsx deleted file mode 100644 index 906f52537..000000000 --- a/src/handbook/src/ui/App.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React from "react"; - -import SideBar from "@views/SideBar"; -import Content from "@views/Content"; -import Overlay from "@views/Overlay"; -import PlainText from "@views/PlainText"; - -import type { Page } from "@backend/types"; -import { isPage } from "@backend/types"; - -import "@css/App.scss"; -import "@css/Text.scss"; - -// Based on the design at: https://www.figma.com/file/PDeAVDkTDF5vvUGGdaIZ39/GM-Handbook. -// Currently designed by: Magix. - -interface IState { - initial: Page | null; - plain: boolean; -} - -class App extends React.Component<{}, IState> { - constructor(props: any) { - super(props); - - // Check if the window's href is a page. - let targetPage = null; - const page = window.location.href.split("/").pop(); - - if (page != undefined && page != "") { - // Convert the page to a Page type. - const pageName = page.charAt(0).toUpperCase() + page.slice(1); - // Check if the page is a valid page. - if (isPage(pageName)) targetPage = pageName as Page; - } - - this.state = { - initial: targetPage as Page | null, - plain: false - }; - } - - render() { - return ( -
- - - {this.state.plain ? : <Content initial={this.state.initial} />} - - <Overlay /> - </div> - ); - } -} - -export default App; diff --git a/src/handbook/src/ui/components/TextState.tsx b/src/handbook/src/ui/components/TextState.tsx deleted file mode 100644 index 4bc0b32c6..000000000 --- a/src/handbook/src/ui/components/TextState.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from "react"; - -import emitter from "@backend/events"; - -interface IProps { - initial: boolean; - event: string; - text1: string; - text2: string; -} - -interface IState { - state: boolean; -} - -class TextState extends React.Component<IProps, IState> { - constructor(props: IProps) { - super(props); - - this.state = { - state: false - }; - } - - /** - * Updates the current state. - * @private - */ - private update(state: boolean): void { - this.setState({ state }); - } - - componentDidMount(): void { - emitter.on(this.props.event, this.update.bind(this)); - } - - componentWillUnmount(): void { - emitter.off(this.props.event, this.update); - } - - render() { - return this.state.state ? this.props.text2 : this.props.text1; - } -} - -export default TextState; diff --git a/src/handbook/src/ui/components/VirtualizedGrid.tsx b/src/handbook/src/ui/components/VirtualizedGrid.tsx deleted file mode 100644 index c1c07d438..000000000 --- a/src/handbook/src/ui/components/VirtualizedGrid.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import React from "react"; - -import { List as _List, ListProps, ListRowProps } from "react-virtualized/dist/es/List"; -import { AutoSizer as _AutoSizer, AutoSizerProps } from "react-virtualized/dist/es/AutoSizer"; - -const List = _List as unknown as React.FC<ListProps>; -const AutoSizer = _AutoSizer as unknown as React.FC<AutoSizerProps>; - -import "@css/components/VirtualizedGrid.scss"; - -interface IProps<T> { - list: T[]; - render: (item: T) => React.ReactNode; - - itemHeight: number; - itemsPerRow?: number; - - gap?: number; - itemGap?: number; -} - -interface IState { - scrollTop: number; - itemsPerRow: number; -} - -class VirtualizedGrid<T> extends React.Component<IProps<T>, IState> { - constructor(props: IProps<T>) { - super(props); - - this.state = { - scrollTop: 0, - itemsPerRow: 10 - }; - } - - /** - * Renders a row of items. - */ - private rowRender(props: ListRowProps): React.ReactNode { - const items: React.ReactNode[] = []; - - // Calculate the items to render. - const perRow = this.state.itemsPerRow ?? 10; - for (let i = 0; i < perRow; i++) { - const itemIndex = props.index * perRow + i; - if (itemIndex < this.props.list.length) { - items.push(this.props.render(this.props.list[itemIndex])); - } - } - - return ( - <div - key={props.key} - style={{ - ...props.style, - gap: this.props.itemGap ?? 0 - }} - className={"GridRow"} - > - {items.map((item, index) => ( - <div key={index}>{item}</div> - ))} - <div style={{ height: this.props.gap ?? 0 }} /> - </div> - ); - } - - componentDidMount() { - this.setState({ - itemsPerRow: Math.floor((window.innerWidth - 650) / (this.props.itemHeight + (this.props.gap ?? 0))) - }); - - window.addEventListener("resize", () => { - this.setState({ - itemsPerRow: Math.floor((window.innerWidth - 650) / (this.props.itemHeight + (this.props.gap ?? 0))) - }); - }); - } - - render() { - const { list, itemHeight } = this.props; - - return ( - <AutoSizer> - {({ height, width }) => ( - <List - height={height - 150} - width={width} - rowHeight={itemHeight + (this.props.gap ?? 0)} - rowCount={Math.ceil(list.length / (this.state.itemsPerRow ?? 10))} - rowRenderer={this.rowRender.bind(this)} - scrollTop={this.state.scrollTop} - onScroll={(e) => this.setState({ scrollTop: e.scrollTop })} - /> - )} - </AutoSizer> - ); - } -} - -export default VirtualizedGrid; diff --git a/src/handbook/src/ui/pages/AvatarsPage.tsx b/src/handbook/src/ui/pages/AvatarsPage.tsx deleted file mode 100644 index fe97e3a6d..000000000 --- a/src/handbook/src/ui/pages/AvatarsPage.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from "react"; - -import Character from "@app/ui/widgets/Character"; - -import type { Avatar } from "@backend/types"; -import { listAvatars } from "@backend/data"; -import { grantAvatar } from "@backend/server"; - -import "@css/pages/AvatarsPage.scss"; - -class AvatarsPage extends React.PureComponent { - /** - * Grants the avatar to the user. - * - * @param avatar The avatar to grant. - * @private - */ - private async grantAvatar(avatar: Avatar): Promise<void> { - console.log(await grantAvatar(avatar.id)); - } - - render() { - return ( - <div className={"AvatarsPage"}> - <h1 className={"AvatarsPage_Title"}>Characters</h1> - - <div className={"AvatarsPage_List"}> - {listAvatars().map((avatar) => - avatar.id > 11000000 ? undefined : ( - <Character key={avatar.id} data={avatar} onClick={this.grantAvatar.bind(this, avatar)} /> - ) - )} - </div> - </div> - ); - } -} - -export default AvatarsPage; diff --git a/src/handbook/src/ui/pages/CommandsPage.tsx b/src/handbook/src/ui/pages/CommandsPage.tsx deleted file mode 100644 index b63a0c2b4..000000000 --- a/src/handbook/src/ui/pages/CommandsPage.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; - -import Card from "@widgets/Card"; - -import { listCommands } from "@backend/data"; - -import "@css/pages/CommandsPage.scss"; - -class CommandsPage extends React.PureComponent { - render() { - return ( - <div className={"CommandsPage"}> - <h1 className={"CommandsPage_Title"}>Commands</h1> - - <div className={"CommandsPage_List"}> - {listCommands().map((command) => ( - <Card - key={command.name[0]} - title={command.name[0]} - alternate={ - command.name.length == 1 ? undefined : `(aka /${command.name.slice(1).join(", /")})` - } - description={command.description} - /> - ))} - </div> - </div> - ); - } -} - -export default CommandsPage; diff --git a/src/handbook/src/ui/pages/EntitiesPage.tsx b/src/handbook/src/ui/pages/EntitiesPage.tsx deleted file mode 100644 index f0dbe96da..000000000 --- a/src/handbook/src/ui/pages/EntitiesPage.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import React, { ChangeEvent } from "react"; - -import MiniCard from "@widgets/MiniCard"; -import VirtualizedGrid from "@components/VirtualizedGrid"; - -import { Entity, ItemCategory } from "@backend/types"; -import type { Entity as EntityType, EntityInfo } from "@backend/types"; -import { getEntities } from "@backend/data"; -import { entityIcon, fetchEntityData } from "@app/utils"; - -import "@css/pages/EntitiesPage.scss"; -import EntityCard from "@widgets/EntityCard"; - -interface IState { - filters: ItemCategory[]; - search: string; - - selected: EntityType | null; - selectedInfo: EntityInfo | null; -} - -class EntitiesPage extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - filters: [], - search: "", - - selected: null, - selectedInfo: null - }; - } - - /** - * Should the entity be shown? - * - * @param entity The entity. - * @private - */ - private showEntity(entity: Entity): boolean { - // Check if the entity's name starts with N/A. - if (entity.name.includes("[N/A]")) return false; - - return entity.id > 0; - } - - /** - * Gets the items to render. - * @private - */ - private getEntities(): EntityType[] { - let entities: EntityType[] = []; - - // Add items based on filters. - const filters = this.state.filters; - if (filters.length == 0) { - entities = getEntities(); - } else { - for (const filter of filters) { - // Remove duplicate items. - entities = entities.filter((item, index) => { - return entities.indexOf(item) == index; - }); - } - } - - // Filter out items that don't match the search. - const search = this.state.search.toLowerCase(); - if (search != "") { - entities = entities.filter((item) => { - return item.name.toLowerCase().includes(search); - }); - } - - return entities; - } - - /** - * Invoked when the search input changes. - * - * @param event The event. - * @private - */ - private onChange(event: ChangeEvent<HTMLInputElement>): void { - this.setState({ search: event.target.value }); - } - - /** - * Sets the selected entity. - * - * @param entity The entity. - * @private - */ - private async setSelectedItem(entity: EntityType): Promise<void> { - let data: EntityInfo | null = null; - try { - data = await fetchEntityData(entity); - } catch {} - - this.setState({ - selected: entity, - selectedInfo: data - }); - } - - render() { - const entities = this.getEntities(); - - return ( - <div className={"EntitiesPage"}> - <div className={"EntitiesPage_Content"}> - <div className={"EntitiesPage_Header"}> - <h1 className={"EntitiesPage_Title"}>Monsters</h1> - - <div className={"EntitiesPage_Search"}> - <input - type={"text"} - className={"EntitiesPage_Input"} - placeholder={"Search..."} - onChange={this.onChange.bind(this)} - /> - </div> - </div> - - {entities.length > 0 ? ( - <VirtualizedGrid - list={entities.filter((entity) => this.showEntity(entity))} - itemHeight={64} - itemsPerRow={18} - gap={5} - itemGap={5} - render={(entity) => ( - <MiniCard - key={entity.id} - data={entity} - icon={entityIcon(entity)} - onClick={() => this.setSelectedItem(entity)} - /> - )} - /> - ) : undefined} - </div> - - <div className={"EntitiesPage_Card"}> - <EntityCard entity={this.state.selected} info={this.state.selectedInfo} /> - </div> - </div> - ); - } -} - -export default EntitiesPage; diff --git a/src/handbook/src/ui/pages/HomePage.tsx b/src/handbook/src/ui/pages/HomePage.tsx deleted file mode 100644 index 86fa28c27..000000000 --- a/src/handbook/src/ui/pages/HomePage.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from "react"; - -import HomeButton from "@widgets/HomeButton"; - -import { ReactComponent as DiscordLogo } from "@icons/discord.svg"; - -import Icon_Version_Highlights from "@assets/Icon_Version_Highlights.webp"; -import Icon_Character_Lumine from "@assets/Icon_Character_Lumine.webp"; -import Icon_Inventory from "@assets/Icon_Inventory.webp"; -import Icon_Tutorial_Monster from "@assets/Icon_Tutorial_Monster.webp"; -import Icon_Map from "@assets/Icon_Map.webp"; -import Icon_Quests from "@assets/Icon_Quests.webp"; -import Icon_Achievements from "@assets/Icon_Achievements.webp"; - -import { openUrl } from "@app/utils"; - -import "@css/pages/HomePage.scss"; - -class HomePage extends React.Component<any, any> { - constructor(props: any) { - super(props); - } - - render() { - return ( - <div className={"HomePage"}> - <div className={"HomePage_Top"}> - <h1 className={"HomePage_Title"}>Welcome back, Traveler~</h1> - - <div className={"HomePage_Buttons"}> - <HomeButton name={"Commands"} anchor={"Commands"} icon={Icon_Version_Highlights} /> - <HomeButton name={"Characters"} anchor={"Avatars"} icon={Icon_Character_Lumine} /> - <HomeButton name={"Items"} anchor={"Items"} icon={Icon_Inventory} /> - <HomeButton name={"Entities"} anchor={"Entities"} icon={Icon_Tutorial_Monster} /> - <HomeButton name={"Scenes"} anchor={"Scenes"} icon={Icon_Map} /> - <HomeButton name={"Quests"} anchor={"Quests"} icon={Icon_Quests} /> - <HomeButton name={"Achievements"} anchor={"Achievements"} icon={Icon_Achievements} /> - </div> - </div> - - <div className={"HomePage_Bottom"}> - <div className={"HomePage_Box HomePage_Disclaimer"}> - <p> - <b>This tool is not affiliated with HoYoverse.</b> - <br /> - Genshin Impact, game content and materials are - <br /> - trademarks and copyrights of HoYoverse. - </p> - - <div className={"HomePage_Discord"} onClick={() => openUrl("https://discord.gg/grasscutter")}> - <DiscordLogo /> - <p>Join the Community!</p> - </div> - </div> - - <div className={"HomePage_Text"}> - <div className={"HomePage_Credits"}> - <p>Credits</p> - <p>(hover to see info)</p> - </div> - - <div className={"HomePage_Links"}> - <a href={"https://paimon.moe"}>paimon.moe</a> - <a href={"https://gitlab.com/Dimbreath/AnimeGameData"}>Anime Game Data</a> - <a href={"https://genshin-impact.fandom.com"}>Genshin Impact Wiki</a> - </div> - </div> - </div> - </div> - ); - } -} - -export default HomePage; diff --git a/src/handbook/src/ui/pages/ItemsPage.tsx b/src/handbook/src/ui/pages/ItemsPage.tsx deleted file mode 100644 index 1f4096737..000000000 --- a/src/handbook/src/ui/pages/ItemsPage.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import React, { ChangeEvent } from "react"; - -import MiniCard from "@widgets/MiniCard"; -import ItemCard from "@widgets/ItemCard"; -import VirtualizedGrid from "@components/VirtualizedGrid"; - -import { ItemCategory } from "@backend/types"; -import type { Item as ItemType, ItemInfo } from "@backend/types"; -import { getItems, sortedItems } from "@backend/data"; -import { fetchItemData, itemIcon } from "@app/utils"; - -import "@css/pages/ItemsPage.scss"; - -interface IState { - filters: ItemCategory[]; - search: string; - - selected: ItemType | null; - selectedInfo: ItemInfo | null; -} - -class ItemsPage extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - filters: [], - search: "", - - selected: null, - selectedInfo: null - }; - } - - /** - * Gets the items to render. - * @private - */ - private getItems(): ItemType[] { - let items: ItemType[] = []; - - // Add items based on filters. - const filters = this.state.filters; - if (filters.length == 0) { - items = getItems(); - } else { - for (const filter of filters) { - // Add items from the category. - items = items.concat(sortedItems[filter]); - // Remove duplicate items. - items = items.filter((item, index) => { - return items.indexOf(item) == index; - }); - } - } - - // Filter out items that don't match the search. - const search = this.state.search.toLowerCase(); - if (search != "") { - items = items.filter((item) => { - return item.name.toLowerCase().includes(search); - }); - } - - return items; - } - - /** - * Invoked when the search input changes. - * - * @param event The event. - * @private - */ - private onChange(event: ChangeEvent<HTMLInputElement>): void { - this.setState({ search: event.target.value }); - } - - /** - * Should the item be showed? - * - * @param item The item. - * @private - */ - private showItem(item: ItemType): boolean { - // Check if the item has an icon. - if (item.icon.length == 0) return false; - // Check if the item is a TCG card. - if (item.icon.includes("Gcg")) return false; - - return item.id > 0; - } - - /** - * Sets the selected item. - * - * @param item The item. - * @private - */ - private async setSelectedItem(item: ItemType): Promise<void> { - let data: ItemInfo | null = null; - try { - data = await fetchItemData(item); - } catch {} - - this.setState({ - selected: item, - selectedInfo: data - }); - } - - render() { - const items = this.getItems(); - - return ( - <div className={"ItemsPage"}> - <div className={"ItemsPage_Content"}> - <div className={"ItemsPage_Header"}> - <h1 className={"ItemsPage_Title"}>Items</h1> - - <div className={"ItemsPage_Search"}> - <input - type={"text"} - className={"ItemsPage_Input"} - placeholder={"Search..."} - onChange={this.onChange.bind(this)} - /> - </div> - </div> - - {items.length > 0 ? ( - <VirtualizedGrid - list={items.filter((item) => this.showItem(item))} - itemHeight={64} - itemsPerRow={18} - gap={5} - itemGap={5} - render={(item) => ( - <MiniCard - key={item.id} - data={item} - icon={itemIcon(item)} - onClick={() => this.setSelectedItem(item)} - /> - )} - /> - ) : undefined} - </div> - - <div className={"ItemsPage_Card"}> - <ItemCard item={this.state.selected} info={this.state.selectedInfo} /> - </div> - </div> - ); - } -} - -export default ItemsPage; diff --git a/src/handbook/src/ui/pages/QuestsPage.tsx b/src/handbook/src/ui/pages/QuestsPage.tsx deleted file mode 100644 index c9da0e09e..000000000 --- a/src/handbook/src/ui/pages/QuestsPage.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; - -import Tree, { RawNodeDatum } from "react-d3-tree"; - -import PrimaryQuest from "@widgets/quest/PrimaryQuest"; - -import "@css/pages/QuestsPage.scss"; - -const defaultTree: RawNodeDatum = { - name: "No Quest Selected", - attributes: { - questId: -1 - }, - children: [] -}; - -interface IState { - tree: RawNodeDatum | null; -} - -class QuestsPage extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - tree: null - }; - } - - render() { - return ( - <div className={"QuestsPage"}> - <div className={"QuestsPage_Selector"}> - <PrimaryQuest - quest={{ - id: 351, - title: "Across the Sea" - }} - /> - </div> - - <div className={"QuestsPage_Tree"}> - <Tree data={this.state.tree ?? defaultTree} /> - </div> - </div> - ); - } -} - -export default QuestsPage; diff --git a/src/handbook/src/ui/pages/ScenesPage.tsx b/src/handbook/src/ui/pages/ScenesPage.tsx deleted file mode 100644 index 4f917da54..000000000 --- a/src/handbook/src/ui/pages/ScenesPage.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from "react"; - -import Card from "@widgets/Card"; - -import { SceneType } from "@backend/types"; -import { getScenes } from "@backend/data"; -import { connected, teleportTo } from "@backend/server"; -import { action } from "@backend/commands"; -import { copyToClipboard } from "@app/utils"; - -import "@css/pages/ScenesPage.scss"; - -/** - * Converts a scene type to a string. - * - * @param type The scene type. - */ -function sceneTypeToString(type: SceneType): string { - switch (type) { - default: - return "Unknown"; - case SceneType.None: - return "None"; - case SceneType.World: - return "World"; - case SceneType.Activity: - return "Activity"; - case SceneType.Dungeon: - return "Dungeon"; - case SceneType.Room: - return "Room"; - case SceneType.HomeRoom: - return "Home Room"; - case SceneType.HomeWorld: - return "Home World"; - } -} - -class ScenesPage extends React.PureComponent { - /** - * Teleports the player to the specified scene. - * @private - */ - private async teleport(scene: number): Promise<void> { - if (connected) { - await teleportTo(scene); - } else { - await copyToClipboard(action.teleport(scene)); - } - } - - render() { - return ( - <div className={"ScenesPage"}> - <h1 className={"ScenesPage_Title"}>Scenes</h1> - - <div className={"ScenesPage_List"}> - {getScenes().map((scene) => ( - <Card - key={scene.id} - title={scene.identifier} - alternate={`ID: ${scene.id} | ${sceneTypeToString(scene.type)}`} - button={ - <button className={"ScenesPage_Button"} onClick={() => this.teleport(scene.id)}> - Teleport - </button> - } - rightOffset={13} - height={75} - /> - ))} - </div> - </div> - ); - } -} - -export default ScenesPage; diff --git a/src/handbook/src/ui/views/Content.tsx b/src/handbook/src/ui/views/Content.tsx deleted file mode 100644 index 225ae8c7f..000000000 --- a/src/handbook/src/ui/views/Content.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from "react"; - -import HomePage from "@pages/HomePage"; -import CommandsPage from "@pages/CommandsPage"; -import AvatarsPage from "@pages/AvatarsPage"; -import ItemsPage from "@pages/ItemsPage"; -import EntitiesPage from "@pages/EntitiesPage"; -import ScenesPage from "@pages/ScenesPage"; -import QuestsPage from "@pages/QuestsPage"; - -import type { Page } from "@backend/types"; -import { addNavListener, removeNavListener } from "@backend/events"; - -import "@css/views/Content.scss"; - -interface IProps { - initial?: Page | null; -} - -interface IState { - current: Page; -} - -class Content extends React.Component<IProps, IState> { - constructor(props: IProps) { - super(props); - - this.state = { - current: props.initial ?? "Home" - }; - } - - /** - * Navigates to the specified page. - * - * @param page The page to navigate to. - * @private - */ - private navigate(page: Page): void { - this.setState({ current: page }); - } - - componentDidMount() { - addNavListener(this.navigate.bind(this)); - } - - componentWillUnmount() { - removeNavListener(this.navigate.bind(this)); - } - - render() { - switch (this.state.current) { - default: - return undefined; - case "Home": - return <HomePage />; - case "Commands": - return <CommandsPage />; - case "Avatars": - return <AvatarsPage />; - case "Items": - return <ItemsPage />; - case "Entities": - return <EntitiesPage />; - case "Scenes": - return <ScenesPage />; - case "Quests": - return <QuestsPage />; - } - } -} - -export default Content; diff --git a/src/handbook/src/ui/views/Overlay.tsx b/src/handbook/src/ui/views/Overlay.tsx deleted file mode 100644 index 34248ec19..000000000 --- a/src/handbook/src/ui/views/Overlay.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from "react"; - -import ServerSettings from "@widgets/ServerSettings"; - -import type { Overlays } from "@backend/types"; - -import "@css/views/Overlay.scss"; -import events from "@backend/events"; - -interface IState { - page: Overlays; -} - -class Overlay extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - page: "None" - }; - } - - /** - * Sets the page to display. - * - * @param page The page to display. - */ - private setPage(page: Overlays): void { - this.setState({ page }); - } - - /** - * Gets the page to display. - */ - private getPage(): React.ReactNode { - switch (this.state.page) { - default: - return undefined; - case "ServerSettings": - return <ServerSettings />; - } - } - - componentDidMount() { - events.on("overlay", this.setPage.bind(this)); - } - - componentWillUnmount() { - events.off("overlay", this.setPage.bind(this)); - } - - render() { - return this.state.page != "None" ? <div className={"Overlay"}>{this.getPage()}</div> : undefined; - } -} - -export default Overlay; diff --git a/src/handbook/src/ui/views/PlainText.tsx b/src/handbook/src/ui/views/PlainText.tsx deleted file mode 100644 index fe2487919..000000000 --- a/src/handbook/src/ui/views/PlainText.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import React from "react"; - -import { - listCommands, - listAvatars, - getItems, - getEntities, - getScenes, - listQuests, - getMainQuestFor -} from "@backend/data"; - -import "@css/views/PlainText.scss"; - -class PlainText extends React.PureComponent { - /** - * Creates a paragraph of commands. - * @private - */ - private getCommands(): React.ReactNode { - return ( - <> - {listCommands().map((command) => ( - <p key={command.name[0]}>{`${command.name[0]} : ${command.description}`}</p> - ))} - </> - ); - } - - /** - * Creates a paragraph of avatars. - * @private - */ - private getAvatars(): React.ReactNode { - return ( - <> - {listAvatars() - .sort((a, b) => a.id - b.id) - .map((avatar) => ( - <p key={avatar.id}>{`${avatar.id} : ${avatar.name}`}</p> - ))} - </> - ); - } - - /** - * Creates a paragraph of items. - * @private - */ - private getItems(): React.ReactNode { - return ( - <> - {getItems() - .sort((a, b) => a.id - b.id) - .map((item) => ( - <p key={item.id}>{`${item.id} : ${item.name}`}</p> - ))} - </> - ); - } - - /** - * Creates a paragraph of monsters. - * @private - */ - private getMonsters(): React.ReactNode { - return ( - <> - {getEntities() - .sort((a, b) => a.id - b.id) - .map((entity) => ( - <p key={entity.id}>{`${entity.id} : ${entity.name}`}</p> - ))} - </> - ); - } - - /** - * Creates a paragraph of scenes. - * @private - */ - private getScenes(): React.ReactNode { - return ( - <> - {getScenes() - .sort((a, b) => a.id - b.id) - .map((scene) => ( - <p key={scene.id}>{`${scene.id} : ${scene.identifier} [${scene.type}]`}</p> - ))} - </> - ); - } - - /** - * Creates a paragraph of quests. - * @private - */ - private getQuests(): React.ReactNode { - return ( - <> - {listQuests() - .sort((a, b) => a.id - b.id) - .map((quest) => ( - <p key={quest.id}>{`${quest.id} : ${getMainQuestFor(quest)?.title ?? "Unknown"} - ${ - quest.description - }`}</p> - ))} - </> - ); - } - - render() { - return ( - <div className={"PlainText"}> - <p> - // Grasscutter 3.6.0 GM Handbook - <br /> - // Generated by the HTML GM Handbook. - <br /> - <br /> - <br /> - // Commands - </p> - - {this.getCommands()} - - <p> - <br /> - <br /> - // Avatars - </p> - - {this.getAvatars()} - - <p> - <br /> - <br /> - // Items - </p> - - {this.getItems()} - - <p> - <br /> - <br /> - // Monsters - </p> - - {this.getMonsters()} - - <p> - <br /> - <br /> - // Scenes - </p> - - {this.getScenes()} - - <p> - <br /> - <br /> - // Quests - </p> - - {this.getQuests()} - </div> - ); - } -} - -export default PlainText; diff --git a/src/handbook/src/ui/views/SideBar.tsx b/src/handbook/src/ui/views/SideBar.tsx deleted file mode 100644 index 5d031ab4a..000000000 --- a/src/handbook/src/ui/views/SideBar.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import React, { ChangeEvent } from "react"; - -import SideBarButton from "@app/ui/widgets/SideBarButton"; - -import Icon_Version_Highlights from "@assets/Icon_Version_Highlights.webp"; -import Icon_Character_Lumine from "@assets/Icon_Character_Lumine.webp"; -import Icon_Inventory from "@assets/Icon_Inventory.webp"; -import Icon_Tutorial_Monster from "@assets/Icon_Tutorial_Monster.webp"; -import Icon_Map from "@assets/Icon_Map.webp"; -import Icon_Quests from "@assets/Icon_Quests.webp"; -import Icon_Achievements from "@assets/Icon_Achievements.webp"; - -import events, { navigate } from "@backend/events"; -import { targetPlayer, lockedPlayer, setTargetPlayer } from "@backend/server"; - -import "@css/views/SideBar.scss"; - -interface IState { - uid: string | null; - uidLocked: boolean; -} - -class SideBar extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - uid: targetPlayer > 0 ? targetPlayer.toString() : null, - uidLocked: lockedPlayer - }; - } - - /** - * Invoked when the player's UID changes. - * @private - */ - private updateUid(): void { - this.setState({ - uid: targetPlayer > 0 ? targetPlayer.toString() : null, - uidLocked: lockedPlayer - }); - } - - /** - * Invoked when the UID input changes. - * - * @param event The event. - * @private - */ - private onChange(event: ChangeEvent<HTMLInputElement>): void { - const input = event.target.value; - const uid = input == "" ? null : input; - if (uid && uid.length > 10) return; - - setTargetPlayer(parseInt(uid ?? "0")); - } - - /** - * Invoked when the UID input is right-clicked. - * - * @param event The event. - * @private - */ - private onRightClick(event: React.MouseEvent<HTMLInputElement, MouseEvent>): void { - // Remove focus from the input. - event.currentTarget.blur(); - event.preventDefault(); - - // Open the server settings overlay. - events.emit("overlay", "ServerSettings"); - } - - componentDidMount() { - events.on("connected", this.updateUid.bind(this)); - } - - componentWillUnmount() { - events.off("connected", this.updateUid.bind(this)); - } - - render() { - return ( - <div className={"SideBar"}> - <h1 className={"SideBar_Title"} onClick={() => navigate("Home")}> - The Ultimate Anime Game Handbook - </h1> - - <div - style={{ - display: "flex", - flexDirection: "column", - justifyContent: "space-between", - height: "100%" - }} - > - <div className={"SideBar_Buttons"}> - <SideBarButton name={"Commands"} anchor={"Commands"} icon={Icon_Version_Highlights} /> - <SideBarButton name={"Characters"} anchor={"Avatars"} icon={Icon_Character_Lumine} /> - <SideBarButton name={"Items"} anchor={"Items"} icon={Icon_Inventory} /> - <SideBarButton name={"Entities"} anchor={"Entities"} icon={Icon_Tutorial_Monster} /> - <SideBarButton name={"Scenes"} anchor={"Scenes"} icon={Icon_Map} /> - <SideBarButton name={"Quests"} anchor={"Quests"} icon={Icon_Quests} /> - <SideBarButton name={"Achievements"} anchor={"Achievements"} icon={Icon_Achievements} /> - </div> - - <div className={"SideBar_Enter"}> - <input - type={"text"} - className={"SideBar_Input"} - placeholder={"Enter UID..."} - value={this.state.uid ?? undefined} - disabled={this.state.uidLocked} - onChange={this.onChange.bind(this)} - onContextMenu={this.onRightClick.bind(this)} - /> - </div> - </div> - </div> - ); - } -} - -export default SideBar; diff --git a/src/handbook/src/ui/widgets/Card.tsx b/src/handbook/src/ui/widgets/Card.tsx deleted file mode 100644 index 4043215ba..000000000 --- a/src/handbook/src/ui/widgets/Card.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from "react"; - -import "@css/widgets/Card.scss"; - -interface IProps { - title: string; - alternate?: string; - description?: string | string[]; - - height?: number | string; - button?: React.ReactNode; - rightOffset?: number; - - onClick?: () => void; - onOver?: () => void; - onOut?: () => void; -} - -class Card extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - render() { - return ( - <div - className={"Card"} - onClick={this.props.onClick} - onMouseOver={this.props.onOver} - onMouseOut={this.props.onOut} - style={{ - height: this.props.height, - cursor: this.props.onClick ? "pointer" : undefined - }} - > - <div className={"Card_Content"}> - <div className={"Card_Header"}> - <p className={"Card_Title"}>{this.props.title}</p> - {this.props.alternate && <p className={"Card_Alternate"}>{this.props.alternate}</p>} - </div> - - <div style={{ alignItems: "center" }}> - {this.props.description ? ( - Array.isArray(this.props.description) ? ( - this.props.description.map((line, index) => ( - <p className={"Card_Description"} key={index}> - {line} - </p> - )) - ) : ( - <p className={"Card_Description"}>{this.props.description}</p> - ) - ) : undefined} - </div> - </div> - - {this.props.button ? ( - <div className={"Card_Button"} style={{ marginRight: this.props.rightOffset ?? 0 }}> - {this.props.button} - </div> - ) : undefined} - </div> - ); - } -} - -export default Card; diff --git a/src/handbook/src/ui/widgets/Character.tsx b/src/handbook/src/ui/widgets/Character.tsx deleted file mode 100644 index b3ba3ac9e..000000000 --- a/src/handbook/src/ui/widgets/Character.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React from "react"; - -import type { Avatar } from "@backend/types"; -import { colorFor, formatAvatarName } from "@app/utils"; - -import "@css/widgets/Character.scss"; - -// Image base URL: https://paimon.moe/images/characters/(name).png - -const ignored = [ - 10000001 // Kate -]; - -const nameSwitch: { [key: number]: string } = { - 10000005: "Lumine", - 10000007: "Aether" -}; - -interface IProps { - data: Avatar; - - onClick?: () => void; -} - -class Character extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - render() { - const { name, quality, id } = this.props.data; - const qualityColor = colorFor(quality); - - // Check if the avatar is blacklisted. - if (ignored.includes(id)) return undefined; - - const characterName = nameSwitch[id] ?? name; - - return ( - <div className={"Character"} onClick={this.props.onClick}> - <img - className={"Character_Icon"} - alt={name} - src={`https://paimon.moe/images/characters/${formatAvatarName(name, id)}.png`} - style={{ backgroundColor: `var(${qualityColor})` }} - /> - - <div className={"Character_Label"}> - <p style={{ fontSize: characterName.length >= 10 ? 13 : 17 }}>{characterName}</p> - </div> - </div> - ); - } -} - -export default Character; diff --git a/src/handbook/src/ui/widgets/EntityCard.tsx b/src/handbook/src/ui/widgets/EntityCard.tsx deleted file mode 100644 index c7e494f4c..000000000 --- a/src/handbook/src/ui/widgets/EntityCard.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import React from "react"; - -import type { Entity as EntityType, EntityInfo } from "@backend/types"; -import { copyToClipboard, entityIcon, notNaN } from "@app/utils"; -import { connected, spawnEntity } from "@backend/server"; -import { spawn } from "@backend/commands"; - -import "@css/widgets/ObjectCard.scss"; - -/** - * Converts a description string into a list of paragraphs. - * - * @param description The description to convert. - */ -function toDescription(description: string | undefined): JSX.Element[] { - if (!description) return []; - - return description.split("\\n").map((line, index) => { - return <p key={index}>{line}</p>; - }); -} - -interface IProps { - entity: EntityType | null; - info: EntityInfo | null; -} - -interface IState { - icon: boolean; - count: number | string; - level: number | string; - - showingCount: boolean; -} - -const defaultState = { - icon: true, - count: 1, - level: 1, - showingCount: true -}; - -class EntityCard extends React.Component<IProps, IState> { - constructor(props: IProps) { - super(props); - - this.state = defaultState; - } - - /** - * Updates the count of the item. - * - * @param event The change event. - * @private - */ - private updateCount(event: React.ChangeEvent<HTMLInputElement>) { - let value = event.target.value; - // Remove non-numeric characters. - value = value.replace(/[^0-9]/g, ""); - - let numeric = parseInt(value); - if (isNaN(numeric) && value.length > 1) return; - - // Check if the value should be a level. - if (!this.state.showingCount && numeric > 200) numeric = 200; - - const updated: any = this.state.showingCount ? { count: numeric } : { level: numeric }; - this.setState(updated); - } - - /** - * Adds to the count of the entity. - * - * @param positive Is the count being added or subtracted? - * @param multiple Is the count being multiplied by 10? - * @private - */ - private addCount(positive: boolean, multiple: boolean) { - let value = this.state.showingCount ? this.state.count : this.state.level; - if (value === "") value = 1; - if (typeof value == "string") value = parseInt(value); - if (value < 1) value = 1; - - let increment = 1; - if (!positive) increment = -1; - if (multiple) increment *= 10; - - value = Math.max(1, value + increment); - // Check if the value should be a level. - if (!this.state.showingCount && value > 200) value = 200; - - const updated: any = this.state.showingCount ? { count: value } : { level: value }; - this.setState(updated); - } - - /** - * Summons the entity at the connected player's position. - * @private - */ - private async summonAtPlayer(): Promise<void> { - const entity = this.props.entity?.id ?? 21010101; - const amount = typeof this.state.count == "string" ? parseInt(this.state.count) : this.state.count; - const level = typeof this.state.level == "string" ? parseInt(this.state.level) : this.state.level; - - if (connected) { - await spawnEntity(entity, amount, level); - } else { - await copyToClipboard(spawn.monster(entity, amount, level)); - } - } - - componentDidUpdate(prevProps: Readonly<IProps>, prevState: Readonly<IState>, snapshot?: any) { - if (this.props.entity != prevProps.entity) { - this.setState(defaultState); - } - } - - render() { - const { entity, info } = this.props; - const data = info?.data; - - return entity ? ( - <div className={"ObjectCard"}> - <div className={"ObjectCard_Content"}> - <div className={"ObjectCard_Header"}> - <div className={"ObjectCard_Info"}> - <p>{data?.name ?? entity.name}</p> - <p>{data?.type ?? ""}</p> - </div> - - {this.state.icon && ( - <img - className={"ObjectCard_Icon"} - alt={entity.name} - src={entityIcon(entity)} - onError={() => this.setState({ icon: false })} - /> - )} - </div> - - <div className={"ObjectCard_Description"}>{toDescription(data?.description)}</div> - </div> - - <div className={"ObjectCard_Actions"}> - <div className={"ObjectCard_Counter"}> - <div - onClick={() => this.addCount(false, false)} - onContextMenu={(e) => { - e.preventDefault(); - this.addCount(false, true); - }} - className={"ObjectCard_Operation"} - > - - - </div> - <input - type={"text"} - value={ - this.state.showingCount - ? `x${notNaN(this.state.count)}` - : `Lv${notNaN(this.state.level)}` - } - className={"ObjectCard_Count"} - onChange={this.updateCount.bind(this)} - onBlur={() => { - if (this.state.count == "") { - this.setState({ count: 1 }); - } - }} - /> - <div - onClick={() => this.addCount(true, false)} - onContextMenu={(e) => { - e.preventDefault(); - this.addCount(true, true); - }} - className={"ObjectCard_Operation"} - > - + - </div> - </div> - - <button - className={"ObjectCard_Submit"} - onClick={this.summonAtPlayer.bind(this)} - onContextMenu={(e) => { - e.preventDefault(); - this.setState({ showingCount: !this.state.showingCount }); - }} - > - Summon - </button> - </div> - </div> - ) : undefined; - } -} - -export default EntityCard; diff --git a/src/handbook/src/ui/widgets/HomeButton.tsx b/src/handbook/src/ui/widgets/HomeButton.tsx deleted file mode 100644 index 05e277961..000000000 --- a/src/handbook/src/ui/widgets/HomeButton.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from "react"; - -import type { Page } from "@backend/types"; -import { navigate } from "@backend/events"; - -import "@css/widgets/HomeButton.scss"; - -interface IProps { - name: string; - icon: string; - anchor: Page; -} - -class HomeButton extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - /** - * Redirects the user to the specified anchor. - * @private - */ - private redirect(): void { - navigate(this.props.anchor); - } - - /** - * Checks if this component should be showed. - */ - private shouldShow(): boolean { - return !((window as any).hide as string[]).includes(this.props.anchor.toLowerCase()); - } - - render() { - return this.shouldShow() ? ( - <div className={"HomeButton"} onClick={() => this.redirect()}> - <img className={"HomeButton_Icon"} src={this.props.icon} alt={this.props.name} /> - - <p className={"HomeButton_Label"}>{this.props.name}</p> - </div> - ) : undefined; - } -} - -export default HomeButton; diff --git a/src/handbook/src/ui/widgets/ItemCard.tsx b/src/handbook/src/ui/widgets/ItemCard.tsx deleted file mode 100644 index cb951cbe6..000000000 --- a/src/handbook/src/ui/widgets/ItemCard.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import React from "react"; - -import TextState from "@components/TextState"; - -import type { Item as ItemType, ItemInfo } from "@backend/types"; -import { itemTypeToString } from "@backend/types"; -import { copyToClipboard, itemIcon } from "@app/utils"; -import { connected, giveItem } from "@backend/server"; -import { give } from "@backend/commands"; - -import "@css/widgets/ObjectCard.scss"; - -/** - * Converts a description string into a list of paragraphs. - * - * @param description The description to convert. - */ -function toDescription(description: string | undefined): JSX.Element[] { - if (!description) return []; - - return description.split("\\n").map((line, index) => { - return <p key={index}>{line}</p>; - }); -} - -interface IProps { - item: ItemType | null; - info: ItemInfo | null; -} - -interface IState { - icon: boolean; - count: number | string; -} - -const defaultState = { - icon: true, - count: 1 -}; - -class ItemCard extends React.Component<IProps, IState> { - constructor(props: IProps) { - super(props); - - this.state = defaultState; - } - - /** - * Updates the count of the item. - * - * @param event The change event. - * @private - */ - private updateCount(event: React.ChangeEvent<HTMLInputElement>) { - const value = event.target.value; - if (isNaN(parseInt(value)) && value.length > 1) return; - - this.setState({ count: value }); - } - - /** - * Adds to the count of the item. - * - * @param positive Is the count being added or subtracted? - * @param multiple Is the count being multiplied by 10? - * @private - */ - private addCount(positive: boolean, multiple: boolean) { - let { count } = this.state; - if (count === "") count = 1; - if (typeof count == "string") count = parseInt(count); - if (count < 1) count = 1; - - let increment = 1; - if (!positive) increment = -1; - if (multiple) increment *= 10; - - count = Math.max(1, count + increment); - - this.setState({ count }); - } - - /** - * Adds the item to the player's connected inventory. - * @private - */ - private async addToInventory(): Promise<void> { - const item = this.props.item?.id ?? 102; - const amount = typeof this.state.count == "string" ? parseInt(this.state.count) : this.state.count; - - if (connected) { - await giveItem(item, amount); - } else { - await copyToClipboard(give.basic(item, amount)); - } - } - - componentDidUpdate(prevProps: Readonly<IProps>, prevState: Readonly<IState>, snapshot?: any) { - if (this.props.item != prevProps.item) { - this.setState(defaultState); - } - } - - render() { - const { item, info } = this.props; - const data = info?.data; - - return item ? ( - <div className={"ObjectCard"}> - <div className={"ObjectCard_Content"}> - <div className={"ObjectCard_Header"}> - <div className={"ObjectCard_Info"}> - <p>{data?.name ?? item.name}</p> - <p>{data?.type ?? itemTypeToString(item.type)}</p> - </div> - - {this.state.icon && ( - <img - className={"ObjectCard_Icon"} - alt={item.name} - src={itemIcon(item)} - onError={() => this.setState({ icon: false })} - /> - )} - </div> - - <div className={"ObjectCard_Description"}>{toDescription(data?.description)}</div> - </div> - - <div className={"ObjectCard_Actions"}> - <div className={"ObjectCard_Counter"}> - <div - onClick={() => this.addCount(false, false)} - onContextMenu={(e) => { - e.preventDefault(); - this.addCount(false, true); - }} - className={"ObjectCard_Operation"} - > - - - </div> - <input - type={"text"} - value={this.state.count} - className={"ObjectCard_Count"} - onChange={this.updateCount.bind(this)} - onBlur={() => { - if (this.state.count == "") { - this.setState({ count: 1 }); - } - }} - /> - <div - onClick={() => this.addCount(true, false)} - onContextMenu={(e) => { - e.preventDefault(); - this.addCount(true, true); - }} - className={"ObjectCard_Operation"} - > - + - </div> - </div> - - <button className={"ObjectCard_Submit"} onClick={this.addToInventory.bind(this)}> - <TextState - initial={connected} - event={"connected"} - text1={"Copy Command"} - text2={"Add to Inventory"} - /> - </button> - </div> - </div> - ) : undefined; - } -} - -export default ItemCard; diff --git a/src/handbook/src/ui/widgets/MiniCard.tsx b/src/handbook/src/ui/widgets/MiniCard.tsx deleted file mode 100644 index a7e45af52..000000000 --- a/src/handbook/src/ui/widgets/MiniCard.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import React from "react"; - -import "@css/widgets/MiniCard.scss"; - -interface IProps { - data: { name: string }; - icon: string; - - onClick?: () => void; -} - -interface IState { - popout: boolean; - icon: boolean; - loaded: boolean; -} - -class MiniCard extends React.Component<IProps, IState> { - loading: number | any; - - containerRef: React.RefObject<HTMLDivElement>; - textRef: React.RefObject<HTMLDivElement>; - - constructor(props: IProps) { - super(props); - - this.state = { - popout: false, - icon: true, - loaded: false - }; - - this.containerRef = React.createRef(); - this.textRef = React.createRef(); - } - - /** - * Replaces the icon with the item's name. - * @private - */ - private replaceIcon(): void { - this.setState({ icon: false, loaded: false }); - } - - private forceReplace(): void { - if (!this.state.loaded) this.replaceIcon(); - } - - /** - * Adjusts the font size of the text to fit the container. - * @private - */ - private adjustFontSize() { - const container = this.containerRef.current; - const text = this.textRef.current; - - if (!container || !text) { - return; - } - - const containerWidth = container.offsetWidth; - const textWidth = text.scrollWidth; - - const fontSize = parseFloat(window.getComputedStyle(text).fontSize); - const availableWidth = containerWidth - 10; - const scaleFactor = availableWidth / textWidth; - - if (scaleFactor < 1) { - const newFontSize = fontSize * scaleFactor; - text.style.fontSize = newFontSize + "px"; - } - } - - componentDidMount() { - this.loading = setTimeout(this.forceReplace.bind(this), 1e3); - this.adjustFontSize(); - } - - componentWillUnmount() { - clearTimeout(this.loading); - this.loading = null; - } - - render() { - return ( - <div className={"MiniCard"} onClick={this.props.onClick}> - <div className={"MiniCard_Background"} ref={this.containerRef}> - {this.state.icon && ( - <img - className={"MiniCard_Icon"} - alt={this.props.data.name} - src={this.props.icon} - onError={this.replaceIcon.bind(this)} - onLoad={() => this.setState({ loaded: true })} - /> - )} - - {(!this.state.loaded || !this.state.icon) && ( - <p className={"MiniCard_Label"} ref={this.textRef}> - {this.props.data.name} - </p> - )} - </div> - </div> - ); - } -} - -export default MiniCard; diff --git a/src/handbook/src/ui/widgets/ServerSettings.tsx b/src/handbook/src/ui/widgets/ServerSettings.tsx deleted file mode 100644 index 6621c42df..000000000 --- a/src/handbook/src/ui/widgets/ServerSettings.tsx +++ /dev/null @@ -1,183 +0,0 @@ -import React from "react"; - -import emitter from "@backend/events"; -import { targetPlayer, address, port, setServerDetails, url, setTargetPlayer } from "@backend/server"; -import { getWindowDetails } from "@app/utils"; - -import "@css/widgets/ServerSettings.scss"; - -interface IState { - webview: boolean; - - address: string; - port: number; -} - -class ServerSettings extends React.Component<{}, IState> { - constructor(props: {}) { - super(props); - - this.state = { - webview: false, - address: address, - port: Number(port) - }; - } - - componentDidMount() { - window.addEventListener("keyup", this.escapeListener.bind(this)); - } - - componentWillUnmount() { - window.removeEventListener("keyup", this.escapeListener.bind(this)); - window.removeEventListener("message", this.handleAuthentication.bind(this)); - } - - /** - * Invoked when the escape key is pressed. - * - * @param e The keyboard event. - * @private - */ - private escapeListener(e: KeyboardEvent): void { - if (e.key === "Escape") { - // Hide the overlay. - emitter.emit("overlay", "None"); - } - } - - /** - * Invoked when the component tries to authenticate. - * @private - */ - private authenticate(): void { - setServerDetails(this.state.address, this.state.port).then(() => { - this.setState({ webview: true }); - }); - - // Add the event listener for authentication. - window.addEventListener("message", this.handleAuthentication.bind(this)); - } - - /** - * Finishes the authentication process. - * - * @param e The message event. - * @private - */ - private handleAuthentication(e: MessageEvent): void { - const data = e.data; // The data sent from the server. - if (data == null) return; // If the data is null, return. - - // Check if the data is an object. - if (typeof data != "object") return; - // Get the data type. - const type = data["type"] ?? null; - if (type != "handbook-auth") return; - - // Get the data. - const uid = data["uid"] ?? null; - const token = data["token"] ?? null; - - // Hide the overlay. - emitter.emit("overlay", "None"); - // Set the token and user ID. - setTargetPlayer(Number(uid), token); - } - - /** - * Invoked when the save button is clicked. - * @private - */ - private save(): void { - // Hide the overlay. - emitter.emit("overlay", "None"); - - // Save the server settings. - setServerDetails(this.state.address, this.state.port.toString()); - } - - render() { - const { disable } = getWindowDetails(); - - return ( - <div className={"ServerSettings"}> - {this.state.webview ? ( - <iframe - className={"ServerSettings_Frame"} - src={`${url()}/handbook/authenticate?uid=${targetPlayer}`} - /> - ) : ( - <> - <div className={"ServerSettings_Content ServerSettings_Top"}> - <h1 className={"ServerSettings_Title"}>Server Settings</h1> - - <div - className={"ServerSettings_Details"} - style={{ - opacity: disable ? 0.5 : 1, - cursor: disable ? "not-allowed" : "default", - userSelect: disable ? "none" : "auto" - }} - > - <div> - <p>Address:</p> - <input - type={"text"} - value={this.state.address} - onChange={(e) => { - const target = e.target as HTMLInputElement; - const value = target.value; - - this.setState({ address: value }); - }} - disabled={disable} - style={{ - cursor: disable ? "not-allowed" : "text", - userSelect: disable ? "none" : "auto" - }} - /> - </div> - - <div> - <p>Port:</p> - <input - type={"text"} - value={this.state.port == 0 ? "" : this.state.port} - onChange={(e) => { - const target = e.target as HTMLInputElement; - const value = target.value; - - if (isNaN(Number(value)) || value.length > 5) { - return; - } - - this.setState({ port: Number(value) }); - }} - disabled={disable} - style={{ - cursor: disable ? "not-allowed" : "text", - userSelect: disable ? "none" : "auto" - }} - /> - </div> - </div> - - <button className={"ServerSettings_Authenticate"} onClick={this.authenticate.bind(this)}> - Authenticate - </button> - </div> - - <div className={"ServerSettings_Content"}> - <button className={"ServerSettings_Save"} onClick={this.save.bind(this)}> - Save - </button> - </div> - </> - )} - </div> - ); - } -} - -export default ServerSettings; diff --git a/src/handbook/src/ui/widgets/SideBarButton.tsx b/src/handbook/src/ui/widgets/SideBarButton.tsx deleted file mode 100644 index ab0c66ba2..000000000 --- a/src/handbook/src/ui/widgets/SideBarButton.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from "react"; - -import type { Page } from "@backend/types"; -import { navigate } from "@backend/events"; - -import "@css/widgets/SideBarButton.scss"; - -interface IProps { - name: string; - icon: string; - anchor: Page; -} - -class SideBarButton extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - /** - * Redirects the user to the specified anchor. - * @private - */ - private redirect(): void { - navigate(this.props.anchor); - } - - /** - * Checks if this component should be showed. - */ - private shouldShow(): boolean { - return !((window as any).hide as string[]).includes(this.props.anchor.toLowerCase()); - } - - render() { - return this.shouldShow() ? ( - <div className={"SideBarButton"} onClick={() => this.redirect()}> - <img className={"SideBarButton_Icon"} src={this.props.icon} alt={this.props.name} /> - - <p className={"SideBarButton_Label"}>{this.props.name}</p> - </div> - ) : undefined; - } -} - -export default SideBarButton; diff --git a/src/handbook/src/ui/widgets/quest/NormalQuest.tsx b/src/handbook/src/ui/widgets/quest/NormalQuest.tsx deleted file mode 100644 index 66cde27dd..000000000 --- a/src/handbook/src/ui/widgets/quest/NormalQuest.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from "react"; - -import { IoLocationSharp } from "react-icons/io5"; - -import type { Quest } from "@backend/types"; - -import "@css/widgets/quest/NormalQuest.scss"; - -interface IProps { - quest: Quest; - right?: boolean; -} - -class NormalQuest extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - render() { - const { quest } = this.props; - - return ( - <div className={"NormalQuest"} datatype={this.props.right ? "right" : "left"}> - <div className={"NormalQuest_Info"}> - <p className={"font-bold"}>{quest.description}</p> - <p> - ID: {quest.id} | Main: {quest.mainId} - </p> - </div> - - <IoLocationSharp className={"NormalQuest_Icon"} /> - </div> - ); - } -} - -export default NormalQuest; diff --git a/src/handbook/src/ui/widgets/quest/PrimaryQuest.tsx b/src/handbook/src/ui/widgets/quest/PrimaryQuest.tsx deleted file mode 100644 index c30477b01..000000000 --- a/src/handbook/src/ui/widgets/quest/PrimaryQuest.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from "react"; - -import { GiSupersonicArrow } from "react-icons/gi"; - -import Collapsible from "react-collapsible"; -import NormalQuest from "@widgets/quest/NormalQuest"; - -import type { MainQuest } from "@backend/types"; -import { listSubQuestsFor } from "@backend/data"; - -import "@css/widgets/quest/PrimaryQuest.scss"; - -interface IProps { - quest: MainQuest; -} - -function Trigger(props: IProps): React.ReactElement { - return ( - <div className={"Trigger"}> - <GiSupersonicArrow className={"Trigger_Icon"} /> - <div className={"Trigger_Info"}> - <p className={"font-bold"}>{props.quest.title}</p> - <p>ID: {props.quest.id}</p> - </div> - </div> - ); -} - -class PrimaryQuest extends React.PureComponent<IProps> { - constructor(props: IProps) { - super(props); - } - - render() { - return ( - <Collapsible - className={"PrimaryQuest"} - openedClassName={"PrimaryQuest"} - trigger={<Trigger quest={this.props.quest} />} - transitionTime={50} - > - <div className={"PrimaryQuest_List"}> - {listSubQuestsFor(this.props.quest).map((quest) => ( - <NormalQuest key={quest.id} quest={quest} right /> - ))} - </div> - </Collapsible> - ); - } -} - -export default PrimaryQuest; diff --git a/src/handbook/src/utils.ts b/src/handbook/src/utils.ts deleted file mode 100644 index 286c657ea..000000000 --- a/src/handbook/src/utils.ts +++ /dev/null @@ -1,181 +0,0 @@ -import type { Entity, Item, EntityInfo, ItemInfo, WindowDetails } from "@backend/types"; -import { ItemType, Quality } from "@backend/types"; - -/** - * Fetches the name of the CSS variable for the quality. - * - * @param quality The quality of the item. - */ -export function colorFor(quality: Quality): string { - switch (quality) { - default: - return "--legendary-color"; - case "EPIC": - return "--epic-color"; - case "RARE": - return "--rare-color"; - case "UNCOMMON": - return "--uncommon-color"; - case "COMMON": - return "--common-color"; - case "UNKNOWN": - return "--unknown-color"; - } -} - -/** - * Checks if a value is between two numbers. - * - * @param value The value to check. - * @param min The minimum value. - * @param max The maximum value. - */ -export function inRange(value: number, min: number, max: number): boolean { - return value >= min && value <= max; -} - -/** - * Gets the path to the icon for an item. - * Uses the Project Amber API to get the icon. - * - * @param item The item to get the icon for. - */ -export function itemIcon(item: Item): string { - // Check if the item matches a special case. - if (inRange(item.id, 1001, 1099)) { - return `https://paimon.moe/images/characters/${formatAvatarName(item.name, item.id)}.png`; - } - - switch (item.type) { - default: - return `https://api.ambr.top/assets/UI/UI_${item.icon}.png`; - case ItemType.Furniture: - return `https://api.ambr.top/assets/UI/furniture/UI_${item.icon}.png`; - case ItemType.Reliquary: - return `https://api.ambr.top/assets/UI/reliquary/UI_${item.icon}.png`; - } -} - -/** - * Gets the path to the icon for an entity. - * Uses the Project Amber API to get the icon. - * - * @param entity The entity to get the icon for. Project Amber data required. - */ -export function entityIcon(entity: Entity): string { - return `https://api.ambr.top/assets/UI/monster/UI_MonsterIcon_${entity.internal}.png`; -} - -/** - * Formats a character's name to fit with the reference name. - * Example: Hu Tao -> hu_tao - * - * @param name The character's name. - * @param id The character's ID. - */ -export function formatAvatarName(name: string, id: number): string { - // Check if a different name is used for the character. - if (refSwitch[id]) name = refSwitch[id]; - return name.toLowerCase().replace(" ", "_"); -} - -const refSwitch: { [key: number]: string } = { - 10000005: "traveler_anemo", - 10000007: "traveler_geo" -}; - -/** - * Gets the route for an item type. - * - * @param type The type of the item. - */ -export function typeToRoute(type: ItemType): string { - switch (type) { - default: - return "material"; - case ItemType.Furniture: - return "furniture"; - case ItemType.Reliquary: - return "reliquary"; - case ItemType.Weapon: - return "weapon"; - } -} - -/** - * Fetches the data for an item. - * Uses the Project Amber API to get the data. - * - * @route GET https://api.ambr.top/v2/EN/{type}/{id} - * @param item The item to fetch the data for. - */ -export async function fetchItemData(item: Item): Promise<ItemInfo> { - let url = `https://api.ambr.top/v2/EN/(type)/(id)`; - - // Replace the type and ID in the URL. - url = url.replace("(type)", typeToRoute(item.type)); - url = url.replace("(id)", item.id.toString()); - - // Fetch the data. - return fetch(url) - .then((res) => res.json()) - .catch(() => {}); -} - -/** - * Fetches the data for an entity. - * Uses the Project Amber API to get the data. - * - * @route GET https://api.ambr.top/v2/en/monster/{id} - * @param entity The entity to fetch the data for. - */ -export async function fetchEntityData(entity: Entity): Promise<EntityInfo> { - return fetch(`https://api.ambr.top/v2/en/monster/${entity.id}`) - .then((res) => res.json()) - .catch(() => {}); -} - -/** - * Attempts to copy text to the clipboard. - * Uses the Clipboard API. - * - * @param text The text to copy. - */ -export async function copyToClipboard(text: string): Promise<void> { - await navigator.clipboard.writeText(text); -} - -/** - * Opens a URL in a new tab. - * Uses the window.open() method. - * - * @param url The URL to open. - */ -export function openUrl(url: string): void { - window.open(url, "_blank"); -} - -/** - * Checks if a value is NaN. - * Returns an empty string if it is. - * - * @param value The value to check. - */ -export function notNaN(value: number | string): string { - const number = parseInt(value.toString()); - return isNaN(number) ? "" : number.toString(); -} - -/** - * Extracts the server details out of the window. - */ -export function getWindowDetails(): WindowDetails { - const details = (window as any).details; - const { address, port, disable } = details; - - return { - address: (address as string).includes("DETAILS_ADDRESS") ? "127.0.0.1" : address, - port: (port as string).includes("DETAILS_PORT") ? 443 : parseInt(port), - disable: (disable as string).includes("DETAILS_DISABLE") ? false : disable == "true" - }; -} diff --git a/src/handbook/tsconfig.json b/src/handbook/tsconfig.json deleted file mode 100644 index f2c27fcd0..000000000 --- a/src/handbook/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - "baseUrl": ".", - "paths": { - "@app/*": ["src/*"], - "@backend/*": ["src/backend/*"], - "@css/*": ["src/css/*"], - "@ui/*": ["src/ui/*"], - "@icons/*": ["src/icons/*"], - "@views/*": ["src/ui/views/*"], - "@pages/*": ["src/ui/pages/*"], - "@widgets/*": ["src/ui/widgets/*"], - "@components/*": ["src/ui/components/*"], - "@data/*": ["data/*"], - "@assets/*": ["data/assets/*"] - } - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/src/handbook/tsconfig.node.json b/src/handbook/tsconfig.node.json deleted file mode 100644 index b8afcc8fa..000000000 --- a/src/handbook/tsconfig.node.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": [ - "vite.config.ts" - ] -} diff --git a/src/handbook/vite.config.ts b/src/handbook/vite.config.ts deleted file mode 100644 index 48079b4bd..000000000 --- a/src/handbook/vite.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -// noinspection JSUnusedGlobalSymbols - -import { defineConfig } from "vite"; - -import react from "@vitejs/plugin-react-swc"; -import tsconfigPaths from "vite-tsconfig-paths"; - -import dsv from "@rollup/plugin-dsv"; -import viteSvgr from "vite-plugin-svgr"; -import { viteSingleFile } from "vite-plugin-singlefile"; - -import postcss from "./cfg/postcss.config.js"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ react(), tsconfigPaths(), dsv(), - viteSvgr(), viteSingleFile() ], - css: { postcss }, - - optimizeDeps: { - exclude: [ - "react-virtualization" - ] - } -}); diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchClient.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchClient.java index 80d943ee8..bd556cef4 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchClient.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchClient.java @@ -21,11 +21,16 @@ import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import org.slf4j.Logger; +/** + * This is a simple implementation of a server-to-server IPC client. + * It is implemented over WebSockets, and supports all Grasscutter versions past 1.6.0 + */ +@Getter public final class DispatchClient extends WebSocketClient implements IDispatcher { - @Getter private final Logger logger = Grasscutter.getLogger(); - @Getter private final Map<Integer, BiConsumer<WebSocket, JsonElement>> handlers = new HashMap<>(); + private final Logger logger = Grasscutter.getLogger(); + private final Map<Integer, BiConsumer<WebSocket, JsonElement>> handlers = new HashMap<>(); - @Getter private final Map<Integer, List<Consumer<JsonElement>>> callbacks = new HashMap<>(); + private final Map<Integer, List<Consumer<JsonElement>>> callbacks = new HashMap<>(); public DispatchClient(URI serverUri) { super(serverUri); diff --git a/src/main/resources/html/handbook_auth.html b/src/main/resources/html/handbook_auth.html deleted file mode 100644 index 72895af5b..000000000 --- a/src/main/resources/html/handbook_auth.html +++ /dev/null @@ -1,46 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <style> - body { - margin: 0; - width: 100vw; - height: 100vh; - - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - - p { - margin: 2px; - } - </style> - <title>Handbook Authentication</title> - </head> - - <body> - <script type="application/javascript"> - if ("{{VALUE}}" === "true") { - parent.postMessage({ - type: "handbook-auth", - token: "{{SESSION_TOKEN}}", - uid: "{{PLAYER_ID}}" - }, "*"); - } - </script> - - <p>Input your Player UID here.</p> - <form method="post"> - <label> - <input - name="playerid" - type="number" - /> - </label> - - <input type="submit" /> - </form> - </body> -</html>