diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 63c9779..064ab08 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -6,4 +6,4 @@ module.exports = { '@electron-toolkit/eslint-config-ts/recommended', '@electron-toolkit/eslint-config-prettier' ] -} +}; diff --git a/.gitignore b/.gitignore index 2fe082c..e657989 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ __pycache__/ *.py[cod] *$py.class +.DS_Store diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 5c9baa4..a76ae61 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -1,5 +1,5 @@ singleQuote: true -semi: false +semi: true printWidth: 100 trailingComma: none plugins: diff --git a/electron-builder.yml b/electron-builder.yml index 1fa3552..2d60e84 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -5,9 +5,15 @@ directories: buildResources: build files: - - 'out/**/*' + - out/** + # make sure to copy everything related to captain asarUnpack: - resources/** +extraResources: + - captain/** + - main.py + - pyproject.toml + - poetry.lock win: executableName: flojoy-studio diff --git a/electron.vite.config.ts b/electron.vite.config.ts index cb30788..7962d1e 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -1,6 +1,6 @@ -import { resolve } from 'path' -import { defineConfig, externalizeDepsPlugin } from 'electron-vite' -import react from '@vitejs/plugin-react' +import { resolve } from 'path'; +import { defineConfig, externalizeDepsPlugin } from 'electron-vite'; +import react from '@vitejs/plugin-react'; export default defineConfig({ main: { @@ -20,4 +20,4 @@ export default defineConfig({ }, plugins: [react()] } -}) +}); diff --git a/package.json b/package.json index 61e2614..d484e61 100644 --- a/package.json +++ b/package.json @@ -35,43 +35,55 @@ "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tooltip": "^1.0.7", - "@tanstack/react-query": "^5.4.3", - "@tanstack/react-query-devtools": "^5.4.3", - "@tanstack/react-router": "0.0.1-beta.198", - "@tanstack/router-devtools": "0.0.1-beta.198", - "axios": "^1.6.0", + "@tanstack/react-query": "^5.8.1", + "@tanstack/react-query-devtools": "^5.8.1", + "axios": "^1.6.1", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", + "electron-log": "^5.0.0", "electron-updater": "^6.1.4", - "python-shell": "^5.0.0", - "sonner": "^1.1.0", + "fix-path": "^3.0.0", + "localforage": "^1.10.0", + "lucide-react": "^0.292.0", + "match-sorter": "^6.3.1", + "react-router-dom": "^6.18.0", + "sonner": "^1.2.0", + "sort-by": "^1.2.0", "tailwind-merge": "^2.0.0", "tailwindcss-animate": "^1.0.7", - "zod": "^3.22.4" + "zod": "^3.22.4", + "zustand": "^4.4.6" }, "devDependencies": { "@electron-toolkit/eslint-config-prettier": "^1.0.1", "@electron-toolkit/eslint-config-ts": "^1.0.0", "@electron-toolkit/tsconfig": "^1.0.1", - "@types/node": "^20.8.10", - "@types/react": "^18.2.33", - "@types/react-dom": "^18.2.14", - "@vitejs/plugin-react": "^4.1.0", + "@types/node": "^20.9.0", + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@vitejs/plugin-react": "^4.1.1", "autoprefixer": "^10.4.16", "concurrently": "^8.2.2", - "electron": "^27.0.2", + "electron": "^27.0.3", "electron-builder": "^24.6.4", "electron-vite": "^1.0.28", - "eslint": "^8.52.0", + "eslint": "^8.53.0", "eslint-plugin-react": "^7.33.2", "postcss": "^8.4.31", "prettier": "^3.0.3", - "prettier-plugin-tailwindcss": "^0.5.6", + "prettier-plugin-tailwindcss": "^0.5.7", "react": "^18.2.0", "react-dom": "^18.2.0", "tailwindcss": "^3.3.5", "typescript": "^5.2.2", "vite": "^4.5.0" + }, + "pnpm": { + "updateConfig": { + "ignoreDependencies": [ + "fix-path" + ] + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ac14cc..329d255 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,64 +7,58 @@ settings: dependencies: '@electron-toolkit/preload': specifier: ^2.0.0 - version: 2.0.0(electron@27.0.2) + version: 2.0.0(electron@27.0.3) '@electron-toolkit/utils': specifier: ^2.0.1 - version: 2.0.1(electron@27.0.2) + version: 2.0.1(electron@27.0.3) '@radix-ui/react-alert-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.2(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-scroll-area': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-separator': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.33)(react@18.2.0) + version: 1.0.2(@types/react@18.2.37)(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.4.3 - version: 5.4.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.8.1 + version: 5.8.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-devtools': - specifier: ^5.4.3 - version: 5.4.3(@tanstack/react-query@5.4.3)(react-dom@18.2.0)(react@18.2.0) - '@tanstack/react-router': - specifier: 0.0.1-beta.198 - version: 0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0) - '@tanstack/router-devtools': - specifier: 0.0.1-beta.198 - version: 0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.8.1 + version: 5.8.1(@tanstack/react-query@5.8.1)(react-dom@18.2.0)(react@18.2.0) axios: - specifier: ^1.6.0 - version: 1.6.0 + specifier: ^1.6.1 + version: 1.6.1 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -73,16 +67,34 @@ dependencies: version: 2.0.0 cmdk: specifier: ^0.2.0 - version: 0.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + version: 0.2.0(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + electron-log: + specifier: ^5.0.0 + version: 5.0.0 electron-updater: specifier: ^6.1.4 version: 6.1.4 - python-shell: - specifier: ^5.0.0 - version: 5.0.0 + fix-path: + specifier: ^3.0.0 + version: 3.0.0 + localforage: + specifier: ^1.10.0 + version: 1.10.0 + lucide-react: + specifier: ^0.292.0 + version: 0.292.0(react@18.2.0) + match-sorter: + specifier: ^6.3.1 + version: 6.3.1 + react-router-dom: + specifier: ^6.18.0 + version: 6.18.0(react-dom@18.2.0)(react@18.2.0) sonner: - specifier: ^1.1.0 - version: 1.1.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.2.0 + version: 1.2.0(react-dom@18.2.0)(react@18.2.0) + sort-by: + specifier: ^1.2.0 + version: 1.2.0 tailwind-merge: specifier: ^2.0.0 version: 2.0.0 @@ -92,29 +104,32 @@ dependencies: zod: specifier: ^3.22.4 version: 3.22.4 + zustand: + specifier: ^4.4.6 + version: 4.4.6(@types/react@18.2.37)(react@18.2.0) devDependencies: '@electron-toolkit/eslint-config-prettier': specifier: ^1.0.1 - version: 1.0.1(eslint@8.52.0)(prettier@3.0.3) + version: 1.0.1(eslint@8.53.0)(prettier@3.0.3) '@electron-toolkit/eslint-config-ts': specifier: ^1.0.0 - version: 1.0.0(eslint@8.52.0)(typescript@5.2.2) + version: 1.0.0(eslint@8.53.0)(typescript@5.2.2) '@electron-toolkit/tsconfig': specifier: ^1.0.1 - version: 1.0.1(@types/node@20.8.10) + version: 1.0.1(@types/node@20.9.0) '@types/node': - specifier: ^20.8.10 - version: 20.8.10 + specifier: ^20.9.0 + version: 20.9.0 '@types/react': - specifier: ^18.2.33 - version: 18.2.33 + specifier: ^18.2.37 + version: 18.2.37 '@types/react-dom': - specifier: ^18.2.14 - version: 18.2.14 + specifier: ^18.2.15 + version: 18.2.15 '@vitejs/plugin-react': - specifier: ^4.1.0 - version: 4.1.0(vite@4.5.0) + specifier: ^4.1.1 + version: 4.1.1(vite@4.5.0) autoprefixer: specifier: ^10.4.16 version: 10.4.16(postcss@8.4.31) @@ -122,8 +137,8 @@ devDependencies: specifier: ^8.2.2 version: 8.2.2 electron: - specifier: ^27.0.2 - version: 27.0.2 + specifier: ^27.0.3 + version: 27.0.3 electron-builder: specifier: ^24.6.4 version: 24.6.4 @@ -131,11 +146,11 @@ devDependencies: specifier: ^1.0.28 version: 1.0.28(vite@4.5.0) eslint: - specifier: ^8.52.0 - version: 8.52.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-plugin-react: specifier: ^7.33.2 - version: 7.33.2(eslint@8.52.0) + version: 7.33.2(eslint@8.53.0) postcss: specifier: ^8.4.31 version: 8.4.31 @@ -143,8 +158,8 @@ devDependencies: specifier: ^3.0.3 version: 3.0.3 prettier-plugin-tailwindcss: - specifier: ^0.5.6 - version: 0.5.6(prettier@3.0.3) + specifier: ^0.5.7 + version: 0.5.7(prettier@3.0.3) react: specifier: ^18.2.0 version: 18.2.0 @@ -159,7 +174,7 @@ devDependencies: version: 5.2.2 vite: specifier: ^4.5.0 - version: 4.5.0(@types/node@20.8.10) + version: 4.5.0(@types/node@20.9.0) packages: @@ -424,21 +439,21 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /@electron-toolkit/eslint-config-prettier@1.0.1(eslint@8.52.0)(prettier@3.0.3): + /@electron-toolkit/eslint-config-prettier@1.0.1(eslint@8.53.0)(prettier@3.0.3): resolution: {integrity: sha512-JERUehgy64/J369nr4AVmCskYAX8DQg8eWkQAHk56Qfh6JGnoiZVsv4nDJLBOdG7M7HKrHiqDgaAEXPOCMiijg==} peerDependencies: eslint: '>= 8.0.0' prettier: '>= 3.0.0' dependencies: - eslint: 8.52.0 - eslint-config-prettier: 8.10.0(eslint@8.52.0) - eslint-plugin-prettier: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.0.3) + eslint: 8.53.0 + eslint-config-prettier: 8.10.0(eslint@8.53.0) + eslint-plugin-prettier: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.0.3) prettier: 3.0.3 transitivePeerDependencies: - '@types/eslint' dev: true - /@electron-toolkit/eslint-config-ts@1.0.0(eslint@8.52.0)(typescript@5.2.2): + /@electron-toolkit/eslint-config-ts@1.0.0(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-AiZwiVZehwf7tDWuvZJxkwKWzriW4/d/2Sh+YmEtDvHqvneP8gaqKoPLC3yUZioN8jAU7yPbaxKdYims2RsfwA==} peerDependencies: eslint: '>=8.0.0' @@ -447,40 +462,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) - eslint: 8.52.0 + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + eslint: 8.53.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@electron-toolkit/preload@2.0.0(electron@27.0.2): + /@electron-toolkit/preload@2.0.0(electron@27.0.3): resolution: {integrity: sha512-zpZDzbqJTZQC5d4LRs2EKruKWnqah+T75s+niBYFemYLtiW5TTZcWi3Q8UxHqnwTudDMuWJb233aaS2yjx3Xiw==} peerDependencies: electron: '>=13.0.0' dependencies: - electron: 27.0.2 + electron: 27.0.3 dev: false - /@electron-toolkit/tsconfig@1.0.1(@types/node@20.8.10): + /@electron-toolkit/tsconfig@1.0.1(@types/node@20.9.0): resolution: {integrity: sha512-M0Mol3odspvtCuheyujLNAW7bXq7KFNYVMRtpjFa4ZfES4MuklXBC7Nli/omvc+PRKlrklgAGx3l4VakjNo8jg==} peerDependencies: '@types/node': '*' dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 dev: true - /@electron-toolkit/utils@2.0.1(electron@27.0.2): + /@electron-toolkit/utils@2.0.1(electron@27.0.3): resolution: {integrity: sha512-3nnjd3D1NIjxdzNrvR5fkJ3kbJNbRkpHppv0/pSbMX6I0DaBzpPXeSfDYuJJKzZrAc3CmGcJa0MU4+AjEOlT4g==} peerDependencies: electron: '>=13.0.0' dependencies: - electron: 27.0.2 + electron: 27.0.3 dev: false - /@electron/asar@3.2.7: - resolution: {integrity: sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg==} + /@electron/asar@3.2.8: + resolution: {integrity: sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==} engines: {node: '>=10.12.0'} hasBin: true dependencies: @@ -535,7 +550,7 @@ packages: resolution: {integrity: sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==} engines: {node: '>=8.6'} dependencies: - '@electron/asar': 3.2.7 + '@electron/asar': 3.2.8 '@malept/cross-spawn-promise': 1.1.1 debug: 4.3.4 dir-compare: 3.3.0 @@ -744,13 +759,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.52.0 + eslint: 8.53.0 eslint-visitor-keys: 3.4.3 dev: true @@ -759,8 +774,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -776,8 +791,8 @@ packages: - supports-color dev: true - /@eslint/js@8.52.0: - resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + /@eslint/js@8.53.0: + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -794,8 +809,8 @@ packages: '@floating-ui/utils': 0.1.6 dev: false - /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} + /@floating-ui/react-dom@2.0.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wOoKUw2P24/OXbNr3bbCqWgoltsyY7lFBDPVtjj/V4WDIJ5hja2C/r+CoWmS+Y75Ahndds3wa7eJRhnJxTCJaQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -809,14 +824,6 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false - /@gisatcz/cross-package-react-context@0.2.0(react@18.2.0): - resolution: {integrity: sha512-E7aR/o1ArpXETO8bQi+Hltj3duHeZiLjR+x1VZrCDs3jplSLGoy+oqCcqNNE1BamTBa0YQTs8Go1Q1dtt3LEUg==} - peerDependencies: - react: ^16.13.1 || ^17.0.2 || ^18.1.0 - dependencies: - react: 18.2.0 - dev: false - /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -904,7 +911,7 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: cross-spawn: 7.0.3 - fast-glob: 3.3.1 + fast-glob: 3.3.2 is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 @@ -929,7 +936,7 @@ packages: '@babel/runtime': 7.23.2 dev: false - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -944,18 +951,18 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -969,14 +976,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: '@types/react': '*' @@ -991,20 +998,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -1018,12 +1025,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1037,7 +1044,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -1047,7 +1054,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1060,7 +1067,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -1070,11 +1077,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.0(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 @@ -1096,12 +1103,12 @@ packages: aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.4(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll: 2.5.4(@types/react@18.2.37)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -1116,26 +1123,26 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.37)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -1145,7 +1152,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1165,7 +1172,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -1180,17 +1187,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -1205,14 +1212,14 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1226,7 +1233,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -1236,7 +1243,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1254,7 +1261,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -1268,11 +1275,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1295,7 +1302,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -1305,12 +1312,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -1324,14 +1331,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -1346,30 +1353,30 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.37)(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -1384,27 +1391,27 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.37)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -1418,18 +1425,18 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@floating-ui/react-dom': 2.0.3(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.37)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1446,7 +1453,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -1460,9 +1467,9 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1480,7 +1487,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1494,10 +1501,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1514,7 +1521,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1528,14 +1535,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -1550,21 +1557,21 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} peerDependencies: '@types/react': '*' @@ -1580,20 +1587,20 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -1609,32 +1616,32 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.37)(react@18.2.0) dev: false - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -1648,9 +1655,9 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1665,7 +1672,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1675,12 +1682,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: '@types/react': '*' @@ -1695,19 +1702,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' @@ -1722,19 +1729,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1748,7 +1755,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1758,7 +1765,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1772,7 +1779,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1782,8 +1789,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1797,7 +1804,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1807,8 +1814,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 react: 18.2.0 dev: false @@ -1821,7 +1828,7 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1831,11 +1838,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: '@types/react': '*' @@ -1845,11 +1852,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1860,11 +1867,11 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1874,12 +1881,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.37)(react@18.2.0) + '@types/react': 18.2.37 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1893,9 +1900,9 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.37 + '@types/react-dom': 18.2.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1906,6 +1913,11 @@ packages: '@babel/runtime': 7.23.2 dev: false + /@remix-run/router@1.11.0: + resolution: {integrity: sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==} + engines: {node: '>=14.0.0'} + dev: false + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1916,34 +1928,29 @@ packages: dependencies: defer-to-connect: 2.0.1 - /@tanstack/history@0.0.1-beta.198: - resolution: {integrity: sha512-iqmFTXXH8Swy18SdwT9N441EbXfiazXxSxjDMdV+RHd0OKASYkJ57GIYidtDw7AP4pW9mhLNLmeBrHwSgU/1gw==} - engines: {node: '>=12'} - dev: false - - /@tanstack/query-core@5.4.3: - resolution: {integrity: sha512-fnI9ORjcuLGm1sNrKatKIosRQUpuqcD4SV7RqRSVmj8JSicX2aoMyKryHEBpVQvf6N4PaBVgBxQomjsbsGPssQ==} + /@tanstack/query-core@5.8.1: + resolution: {integrity: sha512-Y0enatz2zQXBAsd7XmajlCs+WaitdR7dIFkqz9Xd7HL4KV04JOigWVreYseTmNH7YFSBSC/BJ9uuNp1MAf+GfA==} dev: false - /@tanstack/query-devtools@5.4.2: - resolution: {integrity: sha512-EXdaMXi8CxZuMp97J5mq6wy1RduOfoWFv5vtA1U+hyqb8Wst6M8kkkjDSdFvGZIRpYY4K8mKLlEFHNUZDG5dtw==} + /@tanstack/query-devtools@5.7.4: + resolution: {integrity: sha512-wx+gwRZUZq7ISXKFJgaAYvVPt+DwTaLKlzaVLB9SLBFIzcL8Jz8jDQGR9ZQp7/O7SVj0TohS8aFuiiGzQUvWyg==} dev: false - /@tanstack/react-query-devtools@5.4.3(@tanstack/react-query@5.4.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-J9EB50vpK5yvQ5W+AOp9jIQa+1mld+Wwc2GF3VLr2SEDhOyiTiHOjrFGKKL1Cal5Wg8UuS3vexf8trElrtg05A==} + /@tanstack/react-query-devtools@5.8.1(@tanstack/react-query@5.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sE6El2Yj98LlPDzf2Ju9IjWPZvqh2RgoQZ+Jomrfm80uA1HlHUvhXuOB0mOcyc706ZpNpL54no59JbgpHcMuUg==} peerDependencies: - '@tanstack/react-query': ^5.4.3 + '@tanstack/react-query': ^5.8.1 react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@tanstack/query-devtools': 5.4.2 - '@tanstack/react-query': 5.4.3(react-dom@18.2.0)(react@18.2.0) + '@tanstack/query-devtools': 5.7.4 + '@tanstack/react-query': 5.8.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/react-query@5.4.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4aSOrRNa6yEmf7mws5QPTVMn8Lp7L38tFoTZ0c1ZmhIvbr8GIA0WT7X5N3yz/nuK8hUtjw9cAzBr4BPDZZ+tzA==} + /@tanstack/react-query@5.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YMagxS8iNPOLg0pK6WOjdSDlAvWKOf69udLOwQrBVmkC2SRLNLko7elo5Ro3ptlJkXvTVHidxC/h5KGi5bH1XQ==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -1954,75 +1961,9 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 5.4.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@tanstack/react-router@0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AxR4VPTyHeF0YCB2oddMNsXV79Lt0ijDVeQOvYCvISpP2BJxO/Nr9QGewemcPw1xBm9OqpCcxXe7eUKJxFyOyw==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16' - react-dom: '>=16' - dependencies: - '@babel/runtime': 7.23.2 - '@gisatcz/cross-package-react-context': 0.2.0(react@18.2.0) - '@tanstack/react-store': 0.0.1(react-dom@18.2.0)(react@18.2.0) - '@tanstack/router-core': 0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - dev: false - - /@tanstack/react-store@0.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UMAHrm1FjehpfnSCi5Uel7fdoYM8fk2ovyHmoTBv4SPS66hLLEEVPQhALrIkJ0OSi1h+p96HapCFNqlavZADIA==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16' - react-dom: '>=16' - dependencies: - '@tanstack/store': 0.0.1 + '@tanstack/query-core': 5.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - - /@tanstack/router-core@0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4chqtzl28YMyrmVfT94ZFz/NAP/dYd+PaqvKFfJTlbpghvRsaJYSysRGRqMpySQE7dFUSlAzi9OVk16r7FCROA==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16' - react-dom: '>=16' - dependencies: - '@babel/runtime': 7.23.2 - '@gisatcz/cross-package-react-context': 0.2.0(react@18.2.0) - '@tanstack/history': 0.0.1-beta.198 - '@tanstack/store': 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - dev: false - - /@tanstack/router-devtools@0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hYeP5QsAmj/+3x6srI34l5xYfsvQoELtgs3iDFCu2u63hyfJVorUIrw58aPZlvoE58qlo73Oc4MBY6ReGjHPNA==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16' - react-dom: '>=16' - dependencies: - '@babel/runtime': 7.23.2 - '@tanstack/react-router': 0.0.1-beta.198(react-dom@18.2.0)(react@18.2.0) - date-fns: 2.30.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@tanstack/store@0.0.1: - resolution: {integrity: sha512-Hq5mwC9oPD1HVRIsgxASYtJQAv5x7k42SMXBq2b/fMYrtMf7WMkOArOMs/ExoNED214Ql94Ft4zVWr0u2D6a6w==} - engines: {node: '>=12'} dev: false /@tootallnate/once@2.0.0: @@ -2030,31 +1971,31 @@ packages: engines: {node: '>= 10'} dev: true - /@types/babel__core@7.20.3: - resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} + /@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.6 - '@types/babel__template': 7.4.3 - '@types/babel__traverse': 7.20.3 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 dev: true - /@types/babel__generator@7.6.6: - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} dependencies: '@babel/types': 7.23.0 dev: true - /@types/babel__template@7.4.3: - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 dev: true - /@types/babel__traverse@7.20.3: - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} dependencies: '@babel/types': 7.23.0 dev: true @@ -2062,100 +2003,100 @@ packages: /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: - '@types/http-cache-semantics': 4.0.3 + '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.8.10 - '@types/responselike': 1.0.2 + '@types/node': 20.9.0 + '@types/responselike': 1.0.3 - /@types/debug@4.1.10: - resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} + /@types/debug@4.1.11: + resolution: {integrity: sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==} dependencies: - '@types/ms': 0.7.33 + '@types/ms': 0.7.34 dev: true /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 dev: true - /@types/http-cache-semantics@4.0.3: - resolution: {integrity: sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==} + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - /@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 - /@types/ms@0.7.33: - resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: true - /@types/node@18.18.8: - resolution: {integrity: sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==} + /@types/node@18.18.9: + resolution: {integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==} dependencies: undici-types: 5.26.5 - /@types/node@20.8.10: - resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + /@types/node@20.9.0: + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} dependencies: undici-types: 5.26.5 - /@types/plist@3.0.4: - resolution: {integrity: sha512-pTa9xUFQFM9WJGSWHajYNljD+DbVylE1q9IweK1LBhUYJdJ28YNU8j3KZ4Q1Qw+cSl4+QLLLOVmqNjhhvVO8fA==} + /@types/plist@3.0.5: + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} requiresBuild: true dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 xmlbuilder: 15.1.1 dev: true optional: true - /@types/prop-types@15.7.9: - resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} + /@types/prop-types@15.7.10: + resolution: {integrity: sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==} - /@types/react-dom@18.2.14: - resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} + /@types/react-dom@18.2.15: + resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 - /@types/react@18.2.33: - resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} + /@types/react@18.2.37: + resolution: {integrity: sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==} dependencies: - '@types/prop-types': 15.7.9 - '@types/scheduler': 0.16.5 + '@types/prop-types': 15.7.10 + '@types/scheduler': 0.16.6 csstype: 3.1.2 - /@types/responselike@1.0.2: - resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 - /@types/scheduler@0.16.5: - resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} + /@types/scheduler@0.16.6: + resolution: {integrity: sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==} - /@types/semver@7.5.4: - resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} + /@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: true - /@types/verror@1.10.8: - resolution: {integrity: sha512-YhUhnxRYs/NiVUbIs3F/EzviDP/NZCEAE2Mx5DUqLdldUmphOhFCVh7Kc+7zlYEExM0P8dzfbJi0yRlNb2Bw5g==} + /@types/verror@1.10.9: + resolution: {integrity: sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==} requiresBuild: true dev: true optional: true - /@types/yauzl@2.10.2: - resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 optional: true - /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2166,13 +2107,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.9.1 - '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.1 + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 - eslint: 8.52.0 + eslint: 8.53.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -2183,8 +2124,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2193,27 +2134,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.9.1 - '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.9.1 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 - eslint: 8.52.0 + eslint: 8.53.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.9.1: - resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + /@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/visitor-keys': 6.9.1 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 dev: true - /@typescript-eslint/type-utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2222,23 +2163,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) - '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.52.0 + eslint: 8.53.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.9.1: - resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} + /@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): - resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2246,8 +2187,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/visitor-keys': 6.9.1 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2258,30 +2199,30 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): - resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@types/json-schema': 7.0.14 - '@types/semver': 7.5.4 - '@typescript-eslint/scope-manager': 6.9.1 - '@typescript-eslint/types': 6.9.1 - '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) - eslint: 8.52.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + eslint: 8.53.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.9.1: - resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + /@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/types': 6.10.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2289,8 +2230,8 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react@4.1.0(vite@4.5.0): - resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==} + /@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 @@ -2298,9 +2239,9 @@ packages: '@babel/core': 7.23.2 '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) - '@types/babel__core': 7.20.3 + '@types/babel__core': 7.20.4 react-refresh: 0.14.0 - vite: 4.5.0(@types/node@20.8.10) + vite: 4.5.0(@types/node@20.9.0) transitivePeerDependencies: - supports-color dev: true @@ -2351,6 +2292,11 @@ packages: uri-js: 4.4.1 dev: true + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2518,8 +2464,8 @@ packages: engines: {node: '>=0.12.0'} dev: true - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true /asynciterator.prototype@1.0.0: @@ -2544,7 +2490,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001559 + caniuse-lite: 1.0.30001561 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -2557,8 +2503,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.6.0: - resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} + /axios@1.6.1: + resolution: {integrity: sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==} dependencies: follow-redirects: 1.15.3 form-data: 4.0.0 @@ -2629,8 +2575,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001559 - electron-to-chromium: 1.4.572 + caniuse-lite: 1.0.30001561 + electron-to-chromium: 1.4.578 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -2669,7 +2615,7 @@ packages: resolution: {integrity: sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==} dependencies: 7zip-bin: 5.1.1 - '@types/debug': 4.1.10 + '@types/debug': 4.1.11 app-builder-bin: 4.0.0 bluebird-lst: 1.0.9 builder-util-runtime: 9.2.1 @@ -2733,8 +2679,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001559: - resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} + /caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} dev: true /chalk@2.4.2: @@ -2817,13 +2763,13 @@ packages: engines: {node: '>=6'} dev: false - /cmdk@0.2.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /cmdk@0.2.0(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) command-score: 0.1.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2922,6 +2868,13 @@ packages: dev: true optional: true + /cross-spawn@4.0.2: + resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} + dependencies: + lru-cache: 4.1.5 + which: 1.3.1 + dev: false + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2944,6 +2897,7 @@ packages: engines: {node: '>=0.11'} dependencies: '@babel/runtime': 7.23.2 + dev: true /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -2984,6 +2938,11 @@ packages: titleize: 3.0.0 dev: true + /default-shell@1.0.1: + resolution: {integrity: sha512-/Os8tTMPSriNHCsVj3VLjMZblIl1sIg8EXz3qg7C5K+y9calfTA/qzlfPvCQ+LEgLWmtZ9wCnzE1w+S6TPPFyQ==} + engines: {node: '>=4'} + dev: false + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -3064,8 +3023,8 @@ packages: hasBin: true requiresBuild: true dependencies: - '@types/plist': 3.0.4 - '@types/verror': 1.10.8 + '@types/plist': 3.0.5 + '@types/verror': 1.10.9 ajv: 6.12.6 crc: 3.8.0 iconv-corefoundation: 1.1.7 @@ -3126,6 +3085,11 @@ packages: - supports-color dev: true + /electron-log@5.0.0: + resolution: {integrity: sha512-vB3akupmQvA8jAyNL9rULZtf6WoP8vsabjXsRtiqXS6/D37SwN/4LEyj4JD+9Bv6xoTcx/LrVnsIKEEWdq5ClQ==} + engines: {electron: '>= 13', node: '>= 14'} + dev: false + /electron-publish@24.5.0: resolution: {integrity: sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==} dependencies: @@ -3140,8 +3104,8 @@ packages: - supports-color dev: true - /electron-to-chromium@1.4.572: - resolution: {integrity: sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA==} + /electron-to-chromium@1.4.578: + resolution: {integrity: sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==} dev: true /electron-updater@6.1.4: @@ -3176,19 +3140,19 @@ packages: esbuild: 0.18.20 magic-string: 0.30.5 picocolors: 1.0.0 - vite: 4.5.0(@types/node@20.8.10) + vite: 4.5.0(@types/node@20.9.0) transitivePeerDependencies: - supports-color dev: true - /electron@27.0.2: - resolution: {integrity: sha512-4fbcHQ40ZDlqhr5Pamm+M5BF7ry2lGqjFTWTJ/mrBwuiPWu6xhV/RWgUhKBaLqKNfAaNl3eMxV3Jc82gv6JauQ==} + /electron@27.0.3: + resolution: {integrity: sha512-VaB9cI1se+mUtz366NP+zxFVnkHLbCBNO4wwouw3FuGyX/m7/Bv1I89JhWOBv78tC+n11ZYMrVD23Jf6EZgVcg==} engines: {node: '>= 12.20.55'} hasBin: true requiresBuild: true dependencies: '@electron/get': 2.0.3 - '@types/node': 18.18.8 + '@types/node': 18.18.9 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -3348,16 +3312,16 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier@8.10.0(eslint@8.52.0): + /eslint-config-prettier@8.10.0(eslint@8.53.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.52.0 + eslint: 8.53.0 dev: true - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.0.3): + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.0.3): resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3371,14 +3335,14 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.52.0 - eslint-config-prettier: 8.10.0(eslint@8.52.0) + eslint: 8.53.0 + eslint-config-prettier: 8.10.0(eslint@8.53.0) prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-react@7.33.2(eslint@8.52.0): + /eslint-plugin-react@7.33.2(eslint@8.53.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -3389,7 +3353,7 @@ packages: array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.52.0 + eslint: 8.53.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -3416,15 +3380,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.52.0: - resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + /eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.52.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.53.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -3496,6 +3460,19 @@ packages: engines: {node: '>=0.10.0'} dev: true + /execa@0.5.1: + resolution: {integrity: sha512-R66dW/hW3I8yV77Wg4xn6zMguRPUgt59VLm5e85NrOF05ZdPn7YOfPBSw0E9epJDvuzwVWEG+HmEaQ4muYuWKQ==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 4.0.2 + get-stream: 2.3.1 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: false + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3535,7 +3512,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.2 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color @@ -3554,8 +3531,8 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3609,6 +3586,13 @@ packages: path-exists: 4.0.0 dev: true + /fix-path@3.0.0: + resolution: {integrity: sha512-opGAl4+ip5jUikHR2C8Jo7czZ80pz8EK/0gMlAZu7xgDmBqIynlX8SMYg9KowYjAU6HT0nxsSJEWru0u+n+N2Q==} + engines: {node: '>=10'} + dependencies: + shell-path: 2.1.0 + dev: false + /flat-cache@3.1.1: resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} @@ -3656,7 +3640,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} @@ -3673,7 +3657,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-minipass@2.1.0: @@ -3733,6 +3717,14 @@ packages: engines: {node: '>=6'} dev: false + /get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + dev: false + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -3822,7 +3814,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -3840,7 +3832,7 @@ packages: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.2 + '@types/responselike': 1.0.3 cacheable-lookup: 5.0.4 cacheable-request: 7.0.4 decompress-response: 6.0.0 @@ -3973,6 +3965,10 @@ packages: engines: {node: '>= 4'} dev: true + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4161,6 +4157,11 @@ packages: call-bind: 1.0.5 dev: true + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4232,7 +4233,6 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} @@ -4249,7 +4249,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -4304,7 +4304,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 @@ -4334,6 +4334,12 @@ packages: type-check: 0.4.0 dev: true + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -4341,6 +4347,12 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -4374,6 +4386,13 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -4386,6 +4405,14 @@ packages: dependencies: yallist: 4.0.0 + /lucide-react@0.292.0(react@18.2.0): + resolution: {integrity: sha512-rRgUkpEHWpa5VCT66YscInCQmQuPCB1RFRzkkxMxg4b+jaL0V12E3riWWR2Sh5OIiUhCwGW/ZExuEO4Az32E6Q==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -4393,6 +4420,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.23.2 + remove-accents: 0.4.2 + dev: false + /matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -4502,8 +4536,8 @@ packages: object-assign: 4.1.1 thenify-all: 1.6.0 - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -4534,6 +4568,13 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: false + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -4564,6 +4605,11 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + /object-path@0.6.0: + resolution: {integrity: sha512-fxrwsCFi3/p+LeLOAwo/wyRMODZxdGBtUlWRzsEpsUVrisZbEfZ21arxLGfaWfcnqb8oHPNihIb4XPE8CQPN5A==} + engines: {node: '>=0.8.0'} + dev: false + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} @@ -4653,6 +4699,11 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4683,6 +4734,11 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4715,6 +4771,18 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: false + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -4762,7 +4830,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.31 - yaml: 2.3.3 + yaml: 2.3.4 /postcss-nested@6.0.1(postcss@8.4.31): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -4787,7 +4855,7 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -4803,8 +4871,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-tailwindcss@0.5.6(prettier@3.0.3): - resolution: {integrity: sha512-2Xgb+GQlkPAUCFi3sV+NOYcSI5XgduvDBL2Zt/hwJudeKXkyvRS65c38SB0yb9UB40+1rL83I6m0RtlOQ8eHdg==} + /prettier-plugin-tailwindcss@0.5.7(prettier@3.0.3): + resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -4888,6 +4956,10 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -4899,11 +4971,6 @@ packages: engines: {node: '>=6'} dev: true - /python-shell@5.0.0: - resolution: {integrity: sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w==} - engines: {node: '>=0.10'} - dev: false - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4929,7 +4996,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -4939,13 +5006,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.37)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.4(@types/react@18.2.33)(react@18.2.0): + /react-remove-scroll@2.5.4(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} peerDependencies: @@ -4955,16 +5022,16 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.33)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.37)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.37)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.33)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.37)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.37)(react@18.2.0) dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.33)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -4974,16 +5041,39 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.33)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.37)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.37)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.33)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.37)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.37)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): + /react-router-dom@6.18.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.18.0(react@18.2.0) + dev: false + + /react-router@6.18.0(react@18.2.0): + resolution: {integrity: sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.11.0 + react: 18.2.0 + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -4993,7 +5083,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -5053,6 +5143,10 @@ packages: set-function-name: 2.0.1 dev: true + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5234,6 +5328,22 @@ packages: engines: {node: '>=8'} dev: true + /shell-env@0.3.0: + resolution: {integrity: sha512-VrC6OSm5riGAFWvlYExA80Rrlfi4STsztNXjyet9Jf20hbiVeeKvJIesb92gJk7zlmpQjB0wOZpy8ClzVdPVWQ==} + engines: {node: '>=4'} + dependencies: + default-shell: 1.0.1 + execa: 0.5.1 + strip-ansi: 3.0.1 + dev: false + + /shell-path@2.1.0: + resolution: {integrity: sha512-w+mbrnpA+r5jSFS4MgFfxZJ1Wx8qMKkR4gvQ+wgaZEoZCMMYZ6Yl/dcNjW/zLMfmx5a9IVIFwGAtUJcnDMmFrg==} + engines: {node: '>=4'} + dependencies: + shell-env: 0.3.0 + dev: false + /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true @@ -5248,7 +5358,6 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} @@ -5280,8 +5389,8 @@ packages: dev: true optional: true - /sonner@1.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pqc5yd1ekS6dBXLKljRogqatiGJSxCaX8mspnqKjLg5Rzw6eiAUgsG1SS8RuQzOjQq8/MlgFao6sIw9doqAkNg==} + /sonner@1.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4bIPKrhF+Z4yEC4EZvNBswcVzMrUhztOQXqyIoiZqiqN1TT39FeK+TgRsQidvvztnYgOn4+S3LdAsri61c7ATA==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -5290,6 +5399,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /sort-by@1.2.0: + resolution: {integrity: sha512-aRyW65r3xMnf4nxJRluCg0H/woJpksU1dQxRtXYzau30sNBOmf5HACpDd9MZDhKh7ALQ5FgSOfMPwZEtUmMqcg==} + dependencies: + object-path: 0.6.0 + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -5368,6 +5483,13 @@ packages: es-abstract: 1.22.3 dev: true + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5375,6 +5497,11 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -5468,7 +5595,7 @@ packages: chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.0 @@ -5522,18 +5649,10 @@ packages: dependencies: any-promise: 1.3.0 - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false - /tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} dev: false - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false - /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -5673,8 +5792,8 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} /untildify@4.0.0: @@ -5699,7 +5818,7 @@ packages: punycode: 2.3.1 dev: true - /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -5709,12 +5828,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.37)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -5724,7 +5843,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.2.37 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -5756,7 +5875,7 @@ packages: dev: true optional: true - /vite@4.5.0(@types/node@20.8.10): + /vite@4.5.0(@types/node@20.9.0): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -5784,7 +5903,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.8.10 + '@types/node': 20.9.0 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 @@ -5840,6 +5959,13 @@ packages: has-tostringtag: 1.0.0 dev: true + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -5871,6 +5997,10 @@ packages: engines: {node: '>=10'} dev: true + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -5878,8 +6008,8 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} /yargs-parser@21.1.1: @@ -5914,3 +6044,23 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false + + /zustand@4.4.6(@types/react@18.2.37)(react@18.2.0): + resolution: {integrity: sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.37 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/poetry.lock b/poetry.lock index 195b4df..53129a7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "annotated-types" @@ -23,7 +23,6 @@ files = [ ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" @@ -57,20 +56,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "fastapi" version = "0.104.1" @@ -373,28 +358,28 @@ files = [ [[package]] name = "ruff" -version = "0.1.3" -description = "An extremely fast Python linter, written in Rust." +version = "0.1.4" +description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:b46d43d51f7061652eeadb426a9e3caa1e0002470229ab2fc19de8a7b0766901"}, - {file = "ruff-0.1.3-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b8afeb9abd26b4029c72adc9921b8363374f4e7edb78385ffaa80278313a15f9"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca3cf365bf32e9ba7e6db3f48a4d3e2c446cd19ebee04f05338bc3910114528b"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4874c165f96c14a00590dcc727a04dca0cfd110334c24b039458c06cf78a672e"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec2dd31eed114e48ea42dbffc443e9b7221976554a504767ceaee3dd38edeb8"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dc3ec4edb3b73f21b4aa51337e16674c752f1d76a4a543af56d7d04e97769613"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e3de9ed2e39160800281848ff4670e1698037ca039bda7b9274f849258d26ce"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c595193881922cc0556a90f3af99b1c5681f0c552e7a2a189956141d8666fe8"}, - {file = "ruff-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f75e670d529aa2288cd00fc0e9b9287603d95e1536d7a7e0cafe00f75e0dd9d"}, - {file = "ruff-0.1.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76dd49f6cd945d82d9d4a9a6622c54a994689d8d7b22fa1322983389b4892e20"}, - {file = "ruff-0.1.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:918b454bc4f8874a616f0d725590277c42949431ceb303950e87fef7a7d94cb3"}, - {file = "ruff-0.1.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8859605e729cd5e53aa38275568dbbdb4fe882d2ea2714c5453b678dca83784"}, - {file = "ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0b6c55f5ef8d9dd05b230bb6ab80bc4381ecb60ae56db0330f660ea240cb0d4a"}, - {file = "ruff-0.1.3-py3-none-win32.whl", hash = "sha256:3e7afcbdcfbe3399c34e0f6370c30f6e529193c731b885316c5a09c9e4317eef"}, - {file = "ruff-0.1.3-py3-none-win_amd64.whl", hash = "sha256:7a18df6638cec4a5bd75350639b2bb2a2366e01222825562c7346674bdceb7ea"}, - {file = "ruff-0.1.3-py3-none-win_arm64.whl", hash = "sha256:12fd53696c83a194a2db7f9a46337ce06445fb9aa7d25ea6f293cf75b21aca9f"}, - {file = "ruff-0.1.3.tar.gz", hash = "sha256:3ba6145369a151401d5db79f0a47d50e470384d0d89d0d6f7fab0b589ad07c34"}, + {file = "ruff-0.1.4-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:864958706b669cce31d629902175138ad8a069d99ca53514611521f532d91495"}, + {file = "ruff-0.1.4-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9fdd61883bb34317c788af87f4cd75dfee3a73f5ded714b77ba928e418d6e39e"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4eaca8c9cc39aa7f0f0d7b8fe24ecb51232d1bb620fc4441a61161be4a17539"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a9a1301dc43cbf633fb603242bccd0aaa34834750a14a4c1817e2e5c8d60de17"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e8db8ab6f100f02e28b3d713270c857d370b8d61871d5c7d1702ae411df683"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:80fea754eaae06335784b8ea053d6eb8e9aac75359ebddd6fee0858e87c8d510"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6bc02a480d4bfffd163a723698da15d1a9aec2fced4c06f2a753f87f4ce6969c"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862811b403063765b03e716dac0fda8fdbe78b675cd947ed5873506448acea4"}, + {file = "ruff-0.1.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58826efb8b3efbb59bb306f4b19640b7e366967a31c049d49311d9eb3a4c60cb"}, + {file = "ruff-0.1.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fdfd453fc91d9d86d6aaa33b1bafa69d114cf7421057868f0b79104079d3e66e"}, + {file = "ruff-0.1.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e8791482d508bd0b36c76481ad3117987301b86072158bdb69d796503e1c84a8"}, + {file = "ruff-0.1.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01206e361021426e3c1b7fba06ddcb20dbc5037d64f6841e5f2b21084dc51800"}, + {file = "ruff-0.1.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:645591a613a42cb7e5c2b667cbefd3877b21e0252b59272ba7212c3d35a5819f"}, + {file = "ruff-0.1.4-py3-none-win32.whl", hash = "sha256:99908ca2b3b85bffe7e1414275d004917d1e0dfc99d497ccd2ecd19ad115fd0d"}, + {file = "ruff-0.1.4-py3-none-win_amd64.whl", hash = "sha256:1dfd6bf8f6ad0a4ac99333f437e0ec168989adc5d837ecd38ddb2cc4a2e3db8a"}, + {file = "ruff-0.1.4-py3-none-win_arm64.whl", hash = "sha256:d98ae9ebf56444e18a3e3652b3383204748f73e247dea6caaf8b52d37e6b32da"}, + {file = "ruff-0.1.4.tar.gz", hash = "sha256:21520ecca4cc555162068d87c747b8f95e1e95f8ecfcbbe59e8dd00710586315"}, ] [[package]] @@ -454,7 +439,6 @@ h11 = ">=0.8" httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} @@ -676,5 +660,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "~3.10" -content-hash = "812e259ea0cfa70d3048c71c08e04480392874565a2013e33227c5380f66a87d" +python-versions = "~3.11" +content-hash = "c9a4f9eae89a39a416412b9d23ff948844883a730c73b341306245520ce4abe1" diff --git a/postcss.config.js b/postcss.config.js index 85f717c..5cbc2c7 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {} } -} +}; diff --git a/pyproject.toml b/pyproject.toml index a5b1d44..e431a8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,10 +3,10 @@ name = "captain" version = "0.1.0" description = "" authors = ["Joey Yu "] -readme = "README.md" +# readme = "README.md" [tool.poetry.dependencies] -python = "~3.10" +python = "~3.11" fastapi = "^0.104.0" uvicorn = {extras = ["standard"], version = "^0.23.2"} pydantic = "^2.4.2" @@ -18,3 +18,4 @@ ruff = "^0.1.3" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + diff --git a/src/main/captain.ts b/src/main/captain.ts deleted file mode 100644 index a830172..0000000 --- a/src/main/captain.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function spawnCaptain(pythonPath: string, entryPath: string): Promise { - console.log(pythonPath, entryPath) - return new Promise((resolve) => { - resolve('stub') - }) -} diff --git a/src/main/command.ts b/src/main/command.ts new file mode 100644 index 0000000..4d54eff --- /dev/null +++ b/src/main/command.ts @@ -0,0 +1,26 @@ +import log from 'electron-log/main'; + +export type CommandOptions = { + win32: string; + darwin: string; + linux: string; +}; + +export class Command { + constructor(private readonly commands: CommandOptions) {} + + getCommand(): string { + const platform: NodeJS.Platform = process.platform; + switch (platform) { + case 'darwin': + return this.commands.darwin; + case 'win32': + return this.commands.win32; + case 'linux': + return this.commands.linux; + default: + log.error(`Unsupported platform: ${platform}`); + throw new Error(`Unsupported platform: ${platform}`); + } + } +} diff --git a/src/main/conda.ts b/src/main/conda.ts deleted file mode 100644 index 474f649..0000000 --- a/src/main/conda.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { exec } from 'child_process' - -export function getCondaEnvList(): Promise { - return new Promise((resolve, reject) => { - exec('conda env list --json', (error, stdout, stderr) => { - if (error) { - console.log(`error: ${error.message}`) - reject(error.message) - } - console.log(stdout) - if (stderr) { - console.log(`stderr: ${stderr}`) - reject(stderr) - } - resolve(stdout) - }) - }) -} diff --git a/src/main/executor.ts b/src/main/executor.ts new file mode 100644 index 0000000..c6f8c71 --- /dev/null +++ b/src/main/executor.ts @@ -0,0 +1,43 @@ +import { exec } from 'child_process'; +import { app } from 'electron'; +import log from 'electron-log/main'; +import { Command } from './command'; +import { sendToStatusBar } from './logging'; +// import { openLogFolder } from './logging'; + +export function execCommand(command: Command): Promise { + log.info('execCommand: ' + command.getCommand()); + return new Promise((resolve, reject) => { + const child = exec(command.getCommand(), { + cwd: app.isPackaged ? process.resourcesPath : undefined, + shell: process.platform === 'win32' ? 'cmd.exe' : undefined + }); + + let stdout = ''; + let errout = ''; + + child.stdout?.on('data', (data) => { + log.info(data); + stdout += data; + sendToStatusBar(data); + }); + + child.stderr?.on('data', (data) => { + log.error(data); + sendToStatusBar(data); + }); + + child.on('error', (error) => { + log.error(error.message); + errout += error.message; + sendToStatusBar(error.message); + }); + + child.on('close', (code) => { + if (code === 0) { + resolve(stdout); + } + reject(errout); + }); + }); +} diff --git a/src/main/index.ts b/src/main/index.ts index a1c34a6..e01802e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,10 +1,27 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' -import icon from '../../resources/icon.png?asset' -// import { PythonShell } from 'python-shell' -import { getCondaEnvList } from './conda' -// import { spawnCaptain } from './captain' +import { app, shell, BrowserWindow, ipcMain } from 'electron'; +import { join } from 'path'; +import { electronApp, optimizer, is } from '@electron-toolkit/utils'; +import icon from '../../resources/icon.png?asset'; +import { + checkPythonInstallation, + installDependencies, + installPoetry, + installPipx, + killCaptain, + spawnCaptain, + pipxEnsurepath +} from './python'; +import log from 'electron-log/main'; +import fixPath from 'fix-path'; +import { openLogFolder } from './logging'; +import { ChildProcess } from 'child_process'; + +fixPath(); + +// Optional, initialize the logger for any renderer process +log.initialize({ preload: true }); + +log.info('Welcome to Flojoy Studio!'); function createWindow(): void { // Create the browser window. @@ -13,29 +30,37 @@ function createWindow(): void { height: 670, show: false, autoHideMenuBar: true, + titleBarStyle: 'hiddenInset', ...(process.platform === 'linux' ? { icon } : {}), webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false } - }) + }); + + global.mainWindow = mainWindow; mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) + mainWindow.show(); + mainWindow.maximize(); + }); mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) + shell.openExternal(details.url); + return { action: 'deny' }; + }); // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']); } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + mainWindow.loadFile(join(__dirname, '../renderer/index.html')); } + + app.on("before-quit", ()=> { + mainWindow.removeAllListeners('close') + }) } // This method will be called when Electron has finished @@ -43,49 +68,59 @@ function createWindow(): void { // Some APIs can only be used after this event occurs. app.whenReady().then(() => { // Set app user model id for windows - electronApp.setAppUserModelId('com.electron') + electronApp.setAppUserModelId('com.electron'); // Default open or close DevTools by F12 in development // and ignore CommandOrControl + R in production. // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils app.on('browser-window-created', (_, window) => { - optimizer.watchWindowShortcuts(window) - }) + optimizer.watchWindowShortcuts(window); + }); - createWindow() + createWindow(); app.on('activate', function () { // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); + + ipcMain.handle('check-python-installation', checkPythonInstallation); + ipcMain.handle('install-pipx', installPipx); + ipcMain.handle('pipx-ensurepath', pipxEnsurepath); + ipcMain.handle('install-poetry', installPoetry); + ipcMain.handle('install-dependencies', installDependencies); + ipcMain.handle('spawn-captain', spawnCaptain); + ipcMain.handle('kill-captain', killCaptain); + + ipcMain.handle('open-log-folder', openLogFolder); - ipcMain.handle('get-conda-env-list', getCondaEnvList) - - // console.log('Spawning captain...') - // spawnCaptain('', '') - // const shell = new PythonShell('main.py', { - // pythonPath: '/opt/homebrew/Caskroom/miniconda/base/envs/flojoy-studio/bin/python' - // }) - // - // app.on('quit', () => { - // shell.kill() - // if (shell.terminated) { - // console.log('Successfully terminated captain :)') - // } else { - // console.error('Something went wrong when terminating captain!') - // } - // }) -}) + ipcMain.handle('restart-flojoy-studio', () => { + app.relaunch(); + app.exit(); + }); +}); + +app.on('quit', () => { + const captainProcess = global.captainProcess as ChildProcess; + if (captainProcess && captainProcess.exitCode === null) { + const success = killCaptain(); + if (success) { + log.info('Successfully terminated captain :)'); + } else { + log.error('Something went wrong when terminating captain!'); + } + } +}); // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') { - app.quit() + app.quit(); } -}) +}); // In this file you can include the rest of your app"s specific main process // code. You can also put them in separate files and require them here. diff --git a/src/main/logging.ts b/src/main/logging.ts new file mode 100644 index 0000000..a20d3a4 --- /dev/null +++ b/src/main/logging.ts @@ -0,0 +1,11 @@ +import { BrowserWindow, app, shell } from 'electron'; + +export function openLogFolder(): void { + shell.openPath(app.getPath('logs')); +} + +export function sendToStatusBar(message: string): void { + if (global.mainWindow.webContents) { + (global.mainWindow as BrowserWindow).webContents.send('message', message); + } +} diff --git a/src/main/python.ts b/src/main/python.ts new file mode 100644 index 0000000..1281c3d --- /dev/null +++ b/src/main/python.ts @@ -0,0 +1,105 @@ +import log from 'electron-log/main'; +import { execCommand } from './executor'; +import { app } from 'electron'; +import { Command } from './command'; +import { ChildProcess, execSync, spawn } from 'child_process'; +import { sendToStatusBar } from './logging'; + +export function checkPythonInstallation(): Promise { + return execCommand( + new Command({ + darwin: 'python3.11 --version', + win32: 'python -c "import sys; assert sys.version_info >= (3, 11)" && python --version', + linux: 'python3.11 --version' + }) + ); +} + +export function installPipx(): Promise { + return execCommand( + new Command({ + darwin: 'python3.11 -m pip install --user pipx', + win32: 'python -m pip install --user pipx', + linux: 'python3.11 -m pip install --user pipx --break-system-packages' + }) + ); +} + +export async function pipxEnsurepath(): Promise { + const pipxBinScript = + "import pipx.commands.ensure_path;import pipx.constants;script=pipx.commands.ensure_path.get_pipx_user_bin_path();bin=pipx.constants.DEFAULT_PIPX_BIN_DIR;print(bin,';',script)"; + const pipxBinPath = await execCommand( + new Command({ + win32: `python -c "${pipxBinScript}"`, + linux: `python3.11 -c "${pipxBinScript}"`, + darwin: `python.11 -c "${pipxBinScript}"` + }) + ); + process.env.PATH = `${pipxBinPath.trim().split(' ').join('')};${process.env.PATH}`; +} + +export function installPoetry(): Promise { + return execCommand( + new Command({ + darwin: 'python3.11 -m pipx install poetry', + win32: 'python -m pipx install poetry', + linux: 'python3 -m pipx install poetry' + }) + ); +} + +export function installDependencies(): Promise { + return execCommand( + new Command({ + darwin: 'poetry install', + win32: 'poetry install', + linux: 'poetry install' + }) + ); +} + +export function spawnCaptain(): void { + const command = new Command({ + darwin: 'poetry run python3 main.py', + win32: 'poetry run python main.py', + linux: 'poetry run python3 main.py' + }); + + log.info('execCommand: ' + command.getCommand()); + + global.captainProcess = spawn( + command.getCommand().split(' ')[0], + command.getCommand().split(' ').slice(1), + { + cwd: app.isPackaged ? process.resourcesPath : undefined + } + ); + + global.captainProcess.stdout?.on('data', (data) => { + log.info(data.toString()); + sendToStatusBar(data.toString()); + }); + + global.captainProcess.stderr?.on('data', (data) => { + log.error(data.toString()); + sendToStatusBar(data.toString()); + }); + + global.captainProcess.on('error', (error) => { + log.error(error.message); + sendToStatusBar(error.message); + }); +} + +export function killCaptain(): boolean { + if (process.platform === 'win32') { + try { + execSync(`taskkill -F -T -PID ${(global.captainProcess as ChildProcess).pid}`); + return true; + } catch (err) { + log.error(err); + return false; + } + } + return (global.captainProcess as ChildProcess).kill(); +} diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index 377ae14..41aaac8 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -1,9 +1,9 @@ -import { ElectronAPI } from '@electron-toolkit/preload' -import { api } from './api' +import { ElectronAPI } from '@electron-toolkit/preload'; +import { api } from './index'; declare global { interface Window { - electron: ElectronAPI - api: typeof api + electron: ElectronAPI; + api: typeof api; } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 5496328..4137d44 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,24 +1,34 @@ -import { contextBridge, ipcRenderer } from 'electron' -import { electronAPI } from '@electron-toolkit/preload' +import { contextBridge, ipcRenderer } from 'electron'; +import { electronAPI } from '@electron-toolkit/preload'; // Custom APIs for renderer export const api = { - getCondaEnvList: (): Promise => ipcRenderer.invoke('get-conda-env-list') -} + checkPythonInstallation: (): Promise => ipcRenderer.invoke('check-python-installation'), + installPipx: (): Promise => ipcRenderer.invoke('install-pipx'), + pipxEnsurepath: (): Promise => ipcRenderer.invoke('pipx-ensurepath'), + installPoetry: (): Promise => ipcRenderer.invoke('install-poetry'), + installDependencies: (): Promise => ipcRenderer.invoke('install-dependencies'), + getPoetryVenvExecutable: (): Promise => ipcRenderer.invoke('get-poetry-venv-executable'), + spawnCaptain: (): Promise => ipcRenderer.invoke('spawn-captain'), + killCaptain: (): Promise => ipcRenderer.invoke('kill-captain'), + + openLogFolder: (): Promise => ipcRenderer.invoke('open-log-folder'), + restartFlojoyStudio: (): Promise => ipcRenderer.invoke('restart-flojoy-studio') +}; // Use `contextBridge` APIs to expose Electron APIs to // renderer only if context isolation is enabled, otherwise // just add to the DOM global. if (process.contextIsolated) { try { - contextBridge.exposeInMainWorld('electron', electronAPI) - contextBridge.exposeInMainWorld('api', api) + contextBridge.exposeInMainWorld('electron', electronAPI); + contextBridge.exposeInMainWorld('api', api); } catch (error) { - console.error(error) + console.error(error); } } else { // @ts-ignore (define in dts) - window.electron = electronAPI + window.electron = electronAPI; // @ts-ignore (define in dts) - window.api = api + window.api = api; } diff --git a/src/renderer/src/components/index/SetupStep.tsx b/src/renderer/src/components/index/SetupStep.tsx new file mode 100644 index 0000000..9859a84 --- /dev/null +++ b/src/renderer/src/components/index/SetupStep.tsx @@ -0,0 +1,18 @@ +import { SetupStatus } from '@/types/status'; +import { CheckCircle, CircleDashed, CircleDotDashed, XCircle } from 'lucide-react'; + +const SetupStep = ({ status, message }: Omit): JSX.Element => { + return ( +
+
+ {status === 'running' && } + {status === 'completed' && } + {status === 'pending' && } + {status === 'error' && } +
+
{message}
+
+ ); +}; + +export default SetupStep; diff --git a/src/renderer/src/components/root/StatusBar.tsx b/src/renderer/src/components/root/StatusBar.tsx new file mode 100644 index 0000000..357d0e3 --- /dev/null +++ b/src/renderer/src/components/root/StatusBar.tsx @@ -0,0 +1,48 @@ +import { useQuery } from '@tanstack/react-query'; +import { Badge } from '../ui/Badge'; +import { BackendStatus } from '@/types/status'; +import axios from 'axios'; +import { useState } from 'react'; +import { useCaptainStateStore } from '@/stores/lifecycle'; + +const StatusBar = (): JSX.Element => { + const [message, setMessage] = useState(''); + const setCaptainReady = useCaptainStateStore((state) => state.setReady); + const { data, isSuccess } = useQuery({ + queryKey: ['status'], + queryFn: async (): Promise => { + const { data } = await axios.get('http://localhost:2333/status/'); + const parsedData = BackendStatus.safeParse(data); + + if (!parsedData.success) { + setCaptainReady(false); + throw new Error('captain returned an unknown status'); + } + + setCaptainReady(true); + return parsedData.data; + }, + refetchInterval: 1000, + staleTime: 1000, + retry: false + }); + + // Listen for messages from the main process + window.electron.ipcRenderer.on('message', (_, data) => { + console.log(data); + setMessage(data); + }); + + return ( +
+ {isSuccess && data.status === 'OK' ? ( + Operational + ) : ( + Disconnected + )} +
{message}
+
+ ); +}; + +export default StatusBar; diff --git a/src/renderer/src/components/ui/AlertDialog.tsx b/src/renderer/src/components/ui/AlertDialog.tsx index 65ed17b..b34a1d4 100644 --- a/src/renderer/src/components/ui/AlertDialog.tsx +++ b/src/renderer/src/components/ui/AlertDialog.tsx @@ -1,14 +1,14 @@ -import * as React from 'react' -import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog' +import * as React from 'react'; +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; -import { cn } from '@/utils/style' -import { buttonVariants } from '@/components/ui/Button' +import { cn } from '@/utils/style'; +import { buttonVariants } from '@/components/ui/Button'; -const AlertDialog = AlertDialogPrimitive.Root +const AlertDialog = AlertDialogPrimitive.Root; -const AlertDialogTrigger = AlertDialogPrimitive.Trigger +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; -const AlertDialogPortal = AlertDialogPrimitive.Portal +const AlertDialogPortal = AlertDialogPrimitive.Portal; const AlertDialogOverlay = React.forwardRef< React.ElementRef, @@ -22,8 +22,8 @@ const AlertDialogOverlay = React.forwardRef< {...props} ref={ref} /> -)) -AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName +)); +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; const AlertDialogContent = React.forwardRef< React.ElementRef, @@ -40,16 +40,16 @@ const AlertDialogContent = React.forwardRef< {...props} /> -)) -AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName +)); +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes & { className?: string }): JSX.Element => (
-) -AlertDialogHeader.displayName = 'AlertDialogHeader' +); +AlertDialogHeader.displayName = 'AlertDialogHeader'; const AlertDialogFooter = ({ className, @@ -59,8 +59,8 @@ const AlertDialogFooter = ({ className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} /> -) -AlertDialogFooter.displayName = 'AlertDialogFooter' +); +AlertDialogFooter.displayName = 'AlertDialogFooter'; const AlertDialogTitle = React.forwardRef< React.ElementRef, @@ -71,8 +71,8 @@ const AlertDialogTitle = React.forwardRef< className={cn('text-lg font-semibold', className)} {...props} /> -)) -AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName +)); +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; const AlertDialogDescription = React.forwardRef< React.ElementRef, @@ -83,16 +83,16 @@ const AlertDialogDescription = React.forwardRef< className={cn('text-sm text-muted-foreground', className)} {...props} /> -)) -AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName +)); +AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName; const AlertDialogAction = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { className?: string } >(({ className, ...props }, ref) => ( -)) -AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName +)); +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; const AlertDialogCancel = React.forwardRef< React.ElementRef, @@ -103,8 +103,8 @@ const AlertDialogCancel = React.forwardRef< className={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)} {...props} /> -)) -AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; export { AlertDialog, @@ -118,4 +118,4 @@ export { AlertDialogDescription, AlertDialogAction, AlertDialogCancel -} +}; diff --git a/src/renderer/src/components/ui/Badge.tsx b/src/renderer/src/components/ui/Badge.tsx index f9f6c27..053f812 100644 --- a/src/renderer/src/components/ui/Badge.tsx +++ b/src/renderer/src/components/ui/Badge.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' -import { cva, type VariantProps } from 'class-variance-authority' +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const badgeVariants = cva( 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', @@ -20,14 +20,14 @@ const badgeVariants = cva( variant: 'default' } } -) +); export interface BadgeProps extends React.HTMLAttributes, VariantProps {} function Badge({ className, variant, ...props }: BadgeProps): JSX.Element { - return
+ return
; } -export { Badge, badgeVariants } +export { Badge, badgeVariants }; diff --git a/src/renderer/src/components/ui/Button.tsx b/src/renderer/src/components/ui/Button.tsx index 2f19bd1..15f5496 100644 --- a/src/renderer/src/components/ui/Button.tsx +++ b/src/renderer/src/components/ui/Button.tsx @@ -1,8 +1,8 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { cva, type VariantProps } from 'class-variance-authority' +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const buttonVariants = cva( 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', @@ -29,22 +29,22 @@ const buttonVariants = cva( size: 'default' } } -) +); export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { - asChild?: boolean + asChild?: boolean; } const Button = React.forwardRef( ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : 'button' + const Comp = asChild ? Slot : 'button'; return ( - ) + ); } -) -Button.displayName = 'Button' +); +Button.displayName = 'Button'; -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/src/renderer/src/components/ui/Card.tsx b/src/renderer/src/components/ui/Card.tsx index 301f9f9..11e5a09 100644 --- a/src/renderer/src/components/ui/Card.tsx +++ b/src/renderer/src/components/ui/Card.tsx @@ -1,6 +1,6 @@ -import * as React from 'react' +import * as React from 'react'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const Card = React.forwardRef< HTMLDivElement, @@ -11,47 +11,47 @@ const Card = React.forwardRef< className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} /> -)) -Card.displayName = 'Card' +)); +Card.displayName = 'Card'; const CardHeader = React.forwardRef< HTMLDivElement, React.HTMLAttributes & { className?: string } >(({ className, ...props }, ref) => (
-)) -CardHeader.displayName = 'CardHeader' +)); +CardHeader.displayName = 'CardHeader'; const CardTitle = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes & { className?: string } >(({ className, ...props }, ref) => (

-)) -CardTitle.displayName = 'CardTitle' +)); +CardTitle.displayName = 'CardTitle'; const CardDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes & { className?: string } >(({ className, ...props }, ref) => (

-)) -CardDescription.displayName = 'CardDescription' +)); +CardDescription.displayName = 'CardDescription'; const CardContent = React.forwardRef< HTMLDivElement, React.HTMLAttributes & { className?: string } >(({ className, ...props }, ref) => (

-)) -CardContent.displayName = 'CardContent' +)); +CardContent.displayName = 'CardContent'; const CardFooter = React.forwardRef< HTMLDivElement, React.HTMLAttributes & { className?: string } >(({ className, ...props }, ref) => (
-)) -CardFooter.displayName = 'CardFooter' +)); +CardFooter.displayName = 'CardFooter'; -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/src/renderer/src/components/ui/Checkbox.tsx b/src/renderer/src/components/ui/Checkbox.tsx index a8410c6..286efe5 100644 --- a/src/renderer/src/components/ui/Checkbox.tsx +++ b/src/renderer/src/components/ui/Checkbox.tsx @@ -1,8 +1,8 @@ -import * as React from 'react' -import * as CheckboxPrimitive from '@radix-ui/react-checkbox' -import { CheckIcon } from '@radix-ui/react-icons' +import * as React from 'react'; +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import { CheckIcon } from '@radix-ui/react-icons'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const Checkbox = React.forwardRef< React.ElementRef, @@ -20,7 +20,7 @@ const Checkbox = React.forwardRef< -)) -Checkbox.displayName = CheckboxPrimitive.Root.displayName +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; -export { Checkbox } +export { Checkbox }; diff --git a/src/renderer/src/components/ui/Command.tsx b/src/renderer/src/components/ui/Command.tsx index 55a4ae5..f09fc9c 100644 --- a/src/renderer/src/components/ui/Command.tsx +++ b/src/renderer/src/components/ui/Command.tsx @@ -1,10 +1,10 @@ -import * as React from 'react' -import { DialogProps } from '@radix-ui/react-dialog' -import { MagnifyingGlassIcon } from '@radix-ui/react-icons' -import { Command as CommandPrimitive } from 'cmdk' +import * as React from 'react'; +import { DialogProps } from '@radix-ui/react-dialog'; +import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; +import { Command as CommandPrimitive } from 'cmdk'; -import { cn } from '@/utils/style' -import { Dialog, DialogContent } from '@/components/ui/Dialog' +import { cn } from '@/utils/style'; +import { Dialog, DialogContent } from '@/components/ui/Dialog'; const Command = React.forwardRef< React.ElementRef, @@ -18,8 +18,8 @@ const Command = React.forwardRef< )} {...props} /> -)) -Command.displayName = CommandPrimitive.displayName +)); +Command.displayName = CommandPrimitive.displayName; interface CommandDialogProps extends DialogProps {} @@ -32,8 +32,8 @@ const CommandDialog = ({ children, ...props }: CommandDialogProps): JSX.Element - ) -} + ); +}; const CommandInput = React.forwardRef< React.ElementRef, @@ -51,9 +51,9 @@ const CommandInput = React.forwardRef< {...props} />
-)) +)); -CommandInput.displayName = CommandPrimitive.Input.displayName +CommandInput.displayName = CommandPrimitive.Input.displayName; const CommandList = React.forwardRef< React.ElementRef, @@ -64,18 +64,18 @@ const CommandList = React.forwardRef< className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)} {...props} /> -)) +)); -CommandList.displayName = CommandPrimitive.List.displayName +CommandList.displayName = CommandPrimitive.List.displayName; const CommandEmpty = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >((props, ref) => ( -)) +)); -CommandEmpty.displayName = CommandPrimitive.Empty.displayName +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; const CommandGroup = React.forwardRef< React.ElementRef, @@ -89,9 +89,9 @@ const CommandGroup = React.forwardRef< )} {...props} /> -)) +)); -CommandGroup.displayName = CommandPrimitive.Group.displayName +CommandGroup.displayName = CommandPrimitive.Group.displayName; const CommandSeparator = React.forwardRef< React.ElementRef, @@ -102,8 +102,8 @@ const CommandSeparator = React.forwardRef< className={cn('-mx-1 h-px bg-border', className)} {...props} /> -)) -CommandSeparator.displayName = CommandPrimitive.Separator.displayName +)); +CommandSeparator.displayName = CommandPrimitive.Separator.displayName; const CommandItem = React.forwardRef< React.ElementRef, @@ -117,9 +117,9 @@ const CommandItem = React.forwardRef< )} {...props} /> -)) +)); -CommandItem.displayName = CommandPrimitive.Item.displayName +CommandItem.displayName = CommandPrimitive.Item.displayName; const CommandShortcut = ({ className, @@ -130,9 +130,9 @@ const CommandShortcut = ({ className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} /> - ) -} -CommandShortcut.displayName = 'CommandShortcut' + ); +}; +CommandShortcut.displayName = 'CommandShortcut'; export { Command, @@ -144,4 +144,4 @@ export { CommandItem, CommandShortcut, CommandSeparator -} +}; diff --git a/src/renderer/src/components/ui/Dialog.tsx b/src/renderer/src/components/ui/Dialog.tsx index 0abd04f..1580a29 100644 --- a/src/renderer/src/components/ui/Dialog.tsx +++ b/src/renderer/src/components/ui/Dialog.tsx @@ -1,16 +1,16 @@ -import * as React from 'react' -import * as DialogPrimitive from '@radix-ui/react-dialog' -import { Cross2Icon } from '@radix-ui/react-icons' +import * as React from 'react'; +import * as DialogPrimitive from '@radix-ui/react-dialog'; +import { Cross2Icon } from '@radix-ui/react-icons'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; -const Dialog = DialogPrimitive.Root +const Dialog = DialogPrimitive.Root; -const DialogTrigger = DialogPrimitive.Trigger +const DialogTrigger = DialogPrimitive.Trigger; -const DialogPortal = DialogPrimitive.Portal +const DialogPortal = DialogPrimitive.Portal; -const DialogClose = DialogPrimitive.Close +const DialogClose = DialogPrimitive.Close; const DialogOverlay = React.forwardRef< React.ElementRef, @@ -24,8 +24,8 @@ const DialogOverlay = React.forwardRef< )} {...props} /> -)) -DialogOverlay.displayName = DialogPrimitive.Overlay.displayName +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; const DialogContent = React.forwardRef< React.ElementRef, @@ -48,16 +48,16 @@ const DialogContent = React.forwardRef< -)) -DialogContent.displayName = DialogPrimitive.Content.displayName +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; const DialogHeader = ({ className, ...props }: React.HTMLAttributes & { className?: string }): JSX.Element => (
-) -DialogHeader.displayName = 'DialogHeader' +); +DialogHeader.displayName = 'DialogHeader'; const DialogFooter = ({ className, @@ -67,8 +67,8 @@ const DialogFooter = ({ className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} /> -) -DialogFooter.displayName = 'DialogFooter' +); +DialogFooter.displayName = 'DialogFooter'; const DialogTitle = React.forwardRef< React.ElementRef, @@ -79,8 +79,8 @@ const DialogTitle = React.forwardRef< className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} /> -)) -DialogTitle.displayName = DialogPrimitive.Title.displayName +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; const DialogDescription = React.forwardRef< React.ElementRef, @@ -91,8 +91,8 @@ const DialogDescription = React.forwardRef< className={cn('text-sm text-muted-foreground', className)} {...props} /> -)) -DialogDescription.displayName = DialogPrimitive.Description.displayName +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; export { Dialog, @@ -105,4 +105,4 @@ export { DialogFooter, DialogTitle, DialogDescription -} +}; diff --git a/src/renderer/src/components/ui/DropdownMenu.tsx b/src/renderer/src/components/ui/DropdownMenu.tsx index 2d3ffa6..bba4f1a 100644 --- a/src/renderer/src/components/ui/DropdownMenu.tsx +++ b/src/renderer/src/components/ui/DropdownMenu.tsx @@ -1,26 +1,26 @@ -import * as React from 'react' -import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' -import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons' +import * as React from 'react'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; -const DropdownMenu = DropdownMenuPrimitive.Root +const DropdownMenu = DropdownMenuPrimitive.Root; -const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; -const DropdownMenuGroup = DropdownMenuPrimitive.Group +const DropdownMenuGroup = DropdownMenuPrimitive.Group; -const DropdownMenuPortal = DropdownMenuPrimitive.Portal +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; -const DropdownMenuSub = DropdownMenuPrimitive.Sub +const DropdownMenuSub = DropdownMenuPrimitive.Sub; -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; const DropdownMenuSubTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - inset?: boolean + className?: string; + inset?: boolean; } >(({ className, inset, children, ...props }, ref) => ( -)) -DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName +)); +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; const DropdownMenuSubContent = React.forwardRef< React.ElementRef, @@ -50,14 +50,14 @@ const DropdownMenuSubContent = React.forwardRef< )} {...props} /> -)) -DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName +)); +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; const DropdownMenuContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - sideOffset?: number + className?: string; + sideOffset?: number; } >(({ className, sideOffset = 4, ...props }, ref) => ( @@ -72,14 +72,14 @@ const DropdownMenuContent = React.forwardRef< {...props} /> -)) -DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; const DropdownMenuItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - inset?: boolean + className?: string; + inset?: boolean; } >(({ className, inset, ...props }, ref) => ( -)) -DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; const DropdownMenuCheckboxItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - checked: boolean + className?: string; + checked: boolean; } >(({ className, children, checked, ...props }, ref) => ( {children} -)) -DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName +)); +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; const DropdownMenuRadioItem = React.forwardRef< React.ElementRef, @@ -139,14 +139,14 @@ const DropdownMenuRadioItem = React.forwardRef< {children} -)) -DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; const DropdownMenuLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - inset?: boolean + className?: string; + inset?: boolean; } >(({ className, inset, ...props }, ref) => ( -)) -DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; const DropdownMenuSeparator = React.forwardRef< React.ElementRef, @@ -166,16 +166,18 @@ const DropdownMenuSeparator = React.forwardRef< className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} /> -)) -DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes & { className?: string }): JSX.Element => { - return -} -DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' + return ( + + ); +}; +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut'; export { DropdownMenu, @@ -193,4 +195,4 @@ export { DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup -} +}; diff --git a/src/renderer/src/components/ui/Input.tsx b/src/renderer/src/components/ui/Input.tsx index 2178007..d399dd8 100644 --- a/src/renderer/src/components/ui/Input.tsx +++ b/src/renderer/src/components/ui/Input.tsx @@ -1,6 +1,6 @@ -import * as React from 'react' +import * as React from 'react'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; export interface InputProps extends React.InputHTMLAttributes {} @@ -16,9 +16,9 @@ const Input = React.forwardRef( ref={ref} {...props} /> - ) + ); } -) -Input.displayName = 'Input' +); +Input.displayName = 'Input'; -export { Input } +export { Input }; diff --git a/src/renderer/src/components/ui/Label.tsx b/src/renderer/src/components/ui/Label.tsx index c786c59..8a61ee5 100644 --- a/src/renderer/src/components/ui/Label.tsx +++ b/src/renderer/src/components/ui/Label.tsx @@ -1,19 +1,19 @@ -import * as React from 'react' -import * as LabelPrimitive from '@radix-ui/react-label' -import { cva, type VariantProps } from 'class-variance-authority' +import * as React from 'react'; +import * as LabelPrimitive from '@radix-ui/react-label'; +import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const labelVariants = cva( 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70' -) +); const Label = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & VariantProps >(({ className, ...props }, ref) => ( -)) -Label.displayName = LabelPrimitive.Root.displayName +)); +Label.displayName = LabelPrimitive.Root.displayName; -export { Label } +export { Label }; diff --git a/src/renderer/src/components/ui/Popover.tsx b/src/renderer/src/components/ui/Popover.tsx index f3c2c4a..8692d46 100644 --- a/src/renderer/src/components/ui/Popover.tsx +++ b/src/renderer/src/components/ui/Popover.tsx @@ -1,18 +1,18 @@ -import * as React from 'react' -import * as PopoverPrimitive from '@radix-ui/react-popover' +import * as React from 'react'; +import * as PopoverPrimitive from '@radix-ui/react-popover'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; -const Popover = PopoverPrimitive.Root +const Popover = PopoverPrimitive.Root; -const PopoverTrigger = PopoverPrimitive.Trigger +const PopoverTrigger = PopoverPrimitive.Trigger; const PopoverContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - align?: 'start' | 'center' | 'end' - sideOffset?: number + className?: string; + align?: 'start' | 'center' | 'end'; + sideOffset?: number; } >(({ className, align = 'center', sideOffset = 4, ...props }, ref) => ( @@ -27,7 +27,7 @@ const PopoverContent = React.forwardRef< {...props} /> -)) -PopoverContent.displayName = PopoverPrimitive.Content.displayName +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; -export { Popover, PopoverTrigger, PopoverContent } +export { Popover, PopoverTrigger, PopoverContent }; diff --git a/src/renderer/src/components/ui/ScrollArea.tsx b/src/renderer/src/components/ui/ScrollArea.tsx index dce0b09..f2f4ff5 100644 --- a/src/renderer/src/components/ui/ScrollArea.tsx +++ b/src/renderer/src/components/ui/ScrollArea.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' -import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' +import * as React from 'react'; +import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const ScrollArea = React.forwardRef< React.ElementRef, @@ -18,14 +18,14 @@ const ScrollArea = React.forwardRef< -)) -ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName +)); +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; const ScrollBar = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - orientation?: 'vertical' | 'horizontal' + className?: string; + orientation?: 'vertical' | 'horizontal'; } >(({ className, orientation = 'vertical', ...props }, ref) => ( -)) -ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName +)); +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; -export { ScrollArea, ScrollBar } +export { ScrollArea, ScrollBar }; diff --git a/src/renderer/src/components/ui/Select.tsx b/src/renderer/src/components/ui/Select.tsx index f2a4718..01b52b4 100644 --- a/src/renderer/src/components/ui/Select.tsx +++ b/src/renderer/src/components/ui/Select.tsx @@ -1,19 +1,19 @@ -import * as React from 'react' -import { CaretSortIcon, CheckIcon } from '@radix-ui/react-icons' -import * as SelectPrimitive from '@radix-ui/react-select' +import * as React from 'react'; +import { CaretSortIcon, CheckIcon } from '@radix-ui/react-icons'; +import * as SelectPrimitive from '@radix-ui/react-select'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; -const Select = SelectPrimitive.Root +const Select = SelectPrimitive.Root; -const SelectGroup = SelectPrimitive.Group +const SelectGroup = SelectPrimitive.Group; -const SelectValue = SelectPrimitive.Value +const SelectValue = SelectPrimitive.Value; const SelectTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string + className?: string; } >(({ className, children, ...props }, ref) => ( -)) -SelectTrigger.displayName = SelectPrimitive.Trigger.displayName +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; const SelectContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - position?: 'popper' | 'item-aligned' + className?: string; + position?: 'popper' | 'item-aligned'; } >(({ className, children, position = 'popper', ...props }, ref) => ( @@ -62,8 +62,8 @@ const SelectContent = React.forwardRef< -)) -SelectContent.displayName = SelectPrimitive.Content.displayName +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; const SelectLabel = React.forwardRef< React.ElementRef, @@ -74,8 +74,8 @@ const SelectLabel = React.forwardRef< className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} /> -)) -SelectLabel.displayName = SelectPrimitive.Label.displayName +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; const SelectItem = React.forwardRef< React.ElementRef, @@ -96,8 +96,8 @@ const SelectItem = React.forwardRef< {children} -)) -SelectItem.displayName = SelectPrimitive.Item.displayName +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; const SelectSeparator = React.forwardRef< React.ElementRef, @@ -108,8 +108,8 @@ const SelectSeparator = React.forwardRef< className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} /> -)) -SelectSeparator.displayName = SelectPrimitive.Separator.displayName +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; export { Select, @@ -120,4 +120,4 @@ export { SelectLabel, SelectItem, SelectSeparator -} +}; diff --git a/src/renderer/src/components/ui/Separator.tsx b/src/renderer/src/components/ui/Separator.tsx index 99a01e5..500697e 100644 --- a/src/renderer/src/components/ui/Separator.tsx +++ b/src/renderer/src/components/ui/Separator.tsx @@ -1,14 +1,14 @@ -import * as React from 'react' -import * as SeparatorPrimitive from '@radix-ui/react-separator' +import * as React from 'react'; +import * as SeparatorPrimitive from '@radix-ui/react-separator'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const Separator = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - orientation?: 'horizontal' | 'vertical' - decorative?: boolean + className?: string; + orientation?: 'horizontal' | 'vertical'; + decorative?: boolean; } >(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => ( -)) -Separator.displayName = SeparatorPrimitive.Root.displayName +)); +Separator.displayName = SeparatorPrimitive.Root.displayName; -export { Separator } +export { Separator }; diff --git a/src/renderer/src/components/ui/Switch.tsx b/src/renderer/src/components/ui/Switch.tsx index 013f227..af72351 100644 --- a/src/renderer/src/components/ui/Switch.tsx +++ b/src/renderer/src/components/ui/Switch.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' -import * as SwitchPrimitives from '@radix-ui/react-switch' +import * as React from 'react'; +import * as SwitchPrimitives from '@radix-ui/react-switch'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; const Switch = React.forwardRef< React.ElementRef, @@ -21,7 +21,7 @@ const Switch = React.forwardRef< )} /> -)) -Switch.displayName = SwitchPrimitives.Root.displayName +)); +Switch.displayName = SwitchPrimitives.Root.displayName; -export { Switch } +export { Switch }; diff --git a/src/renderer/src/components/ui/Textarea.tsx b/src/renderer/src/components/ui/Textarea.tsx index 107a572..abc08d3 100644 --- a/src/renderer/src/components/ui/Textarea.tsx +++ b/src/renderer/src/components/ui/Textarea.tsx @@ -1,5 +1,5 @@ -import * as React from 'react' -import { cn } from '@/utils/style' +import * as React from 'react'; +import { cn } from '@/utils/style'; export interface TextareaProps extends React.TextareaHTMLAttributes {} @@ -14,9 +14,9 @@ const Textarea = React.forwardRef( ref={ref} {...props} /> - ) + ); } -) -Textarea.displayName = 'Textarea' +); +Textarea.displayName = 'Textarea'; -export { Textarea } +export { Textarea }; diff --git a/src/renderer/src/components/ui/Tooltip.tsx b/src/renderer/src/components/ui/Tooltip.tsx index b5d225b..573ac97 100644 --- a/src/renderer/src/components/ui/Tooltip.tsx +++ b/src/renderer/src/components/ui/Tooltip.tsx @@ -1,19 +1,19 @@ -import * as React from 'react' -import * as TooltipPrimitive from '@radix-ui/react-tooltip' +import * as React from 'react'; +import * as TooltipPrimitive from '@radix-ui/react-tooltip'; -import { cn } from '@/utils/style' +import { cn } from '@/utils/style'; -const TooltipProvider = TooltipPrimitive.Provider +const TooltipProvider = TooltipPrimitive.Provider; -const Tooltip = TooltipPrimitive.Root +const Tooltip = TooltipPrimitive.Root; -const TooltipTrigger = TooltipPrimitive.Trigger +const TooltipTrigger = TooltipPrimitive.Trigger; const TooltipContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - className?: string - sideOffset?: number + className?: string; + sideOffset?: number; } >(({ className, sideOffset = 4, ...props }, ref) => ( -)) -TooltipContent.displayName = TooltipPrimitive.Content.displayName +)); +TooltipContent.displayName = TooltipPrimitive.Content.displayName; -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx index 49fca9d..52de64c 100644 --- a/src/renderer/src/main.tsx +++ b/src/renderer/src/main.tsx @@ -1,35 +1,37 @@ -import ReactDOM from 'react-dom/client' -import './styles/index.css' -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { RouterProvider, Router } from '@tanstack/react-router' -import { rootRoute } from './routes/root/rootRoute' -import { indexRoute } from './routes/index/indexRoute' +import ReactDOM from 'react-dom/client'; +import './styles/index.css'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { Root } from './routes/root/Root'; +import { Index } from './routes/index/Index'; +import { createHashRouter, RouterProvider } from 'react-router-dom'; +import Flow from './routes/flow/Flow'; -const queryClient = new QueryClient() +const queryClient = new QueryClient(); -const routeTree = rootRoute.addChildren([indexRoute]) - -// Set up a Router instance -const router = new Router({ - routeTree, - context: { queryClient }, - defaultPreload: 'intent' -}) - -// Register things for typesafety -declare module '@tanstack/react-router' { - interface Register { - router: typeof router +const router = createHashRouter([ + { + path: '/', + element: , + children: [ + { + path: '/', + element: + }, + { + path: '/flow', + element: + } + ] } -} +]); -const rootElement = document.getElementById('root')! +const rootElement = document.getElementById('root')!; if (!rootElement.innerHTML) { - const root = ReactDOM.createRoot(rootElement) + const root = ReactDOM.createRoot(rootElement); root.render( - ) + ); } diff --git a/src/renderer/src/routes/flow/Flow.tsx b/src/renderer/src/routes/flow/Flow.tsx new file mode 100644 index 0000000..4116670 --- /dev/null +++ b/src/renderer/src/routes/flow/Flow.tsx @@ -0,0 +1,10 @@ +const Flow = (): JSX.Element => { + return ( +
+
+
Almost the end of this packaging battle! 🎉
+
+ ); +}; + +export default Flow; diff --git a/src/renderer/src/routes/index/Index.tsx b/src/renderer/src/routes/index/Index.tsx index 839db62..fd31eb4 100644 --- a/src/renderer/src/routes/index/Index.tsx +++ b/src/renderer/src/routes/index/Index.tsx @@ -1,7 +1,228 @@ +import { useEffect, useState } from 'react'; +import { SetupStatus } from '@/types/status'; +import SetupStep from '@/components/index/SetupStep'; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle +} from '@/components/ui/AlertDialog'; +import { Button } from '@/components/ui/Button'; +import { useCaptainStateStore } from '@/stores/lifecycle'; +import { useNavigate } from 'react-router-dom'; + export const Index = (): JSX.Element => { + const captainReady = useCaptainStateStore((state) => state.ready); + + const [setupStatuses, setSetupStatuses] = useState([ + { + status: 'running', + stage: 'check-python-installation', + message: 'Making sure Python 3.11 is installed on this machine.' + }, + { + status: 'pending', + stage: 'install-dependencies', + message: 'Configure all the magic behind Flojoy Studio.' + }, + { + status: 'pending', + stage: 'spawn-captain', + message: 'Start the Flojoy Studio backend.' + } + ]); + + const [showError, setShowError] = useState(false); + const [errorTitle, setErrorTitle] = useState(''); + const [errorDesc, setErrorDesc] = useState(''); + const [errorActionName, setErrorActionName] = useState(''); + const navigate = useNavigate(); + + const checkPythonInstallation = async (): Promise => { + try { + const data = await window.api.checkPythonInstallation(); + updateSetupStatus({ + stage: 'check-python-installation', + status: 'completed', + message: `Python ${data.split(' ')[1]} is installed!` + }); + } catch (err) { + updateSetupStatus({ + stage: 'check-python-installation', + status: 'error', + message: 'Cannot find any Python 3.11 installation on this machine :(' + }); + setErrorTitle('Could not find Python 3.11 :('); + setErrorDesc('Please install Python 3.11 and try again!'); + setErrorActionName('Download'); + } + }; + + const installDependencies = async (): Promise => { + try { + await window.api.installPipx(); + await window.api.pipxEnsurepath(); + await window.api.installPoetry(); + await window.api.installDependencies(); + + updateSetupStatus({ + stage: 'install-dependencies', + status: 'completed', + message: 'Finished setting up all the magic behind Flojoy Studio.' + }); + } catch (err) { + updateSetupStatus({ + stage: 'install-dependencies', + status: 'error', + message: 'Something went wrong when installing dependencies...' + }); + setErrorTitle('Something went wrong :('); + // TODO: automate the log reporting part + setErrorDesc( + 'Sorry about that! Please open the log folder and send the log to us on Discord!' + ); + setErrorActionName('Open Log Folder'); + } + }; + + const spawnCaptain = async (): Promise => { + try { + await window.api.spawnCaptain(); + } catch (err) { + updateSetupStatus({ + stage: 'spawn-captain', + status: 'error', + message: 'Something went wrong when starting Flojoy Studio...' + }); + setErrorTitle('Something went wrong :('); + // TODO: automate the log reporting part + setErrorDesc( + 'Sorry about that! Please open the log folder and send the log to us on Discord!' + ); + setErrorActionName('Open Log Folder'); + } + }; + + const errorAction = async (): Promise => { + const setupError = setupStatuses.find((status) => status.status === 'error'); + switch (setupError?.stage) { + case 'check-python-installation': { + window.open('https://www.python.org/downloads/release/python-3116/'); + break; + } + case 'install-dependencies': { + await window.api.openLogFolder(); + break; + } + case 'spawn-captain': { + await window.api.openLogFolder(); + break; + } + } + }; + + const updateSetupStatus = (setupStatus: SetupStatus): void => { + setSetupStatuses((prev) => { + return prev.map((status) => { + if (status.stage === setupStatus.stage) { + return { + ...setupStatus + }; + } + return status; + }); + }); + }; + + useEffect(() => { + // Kick off the setup process with this useEffect + checkPythonInstallation(); + }, []); + + useEffect(() => { + // The main logic for the setup process + const hasError = setupStatuses.find((status) => status.status === 'error'); + const isRunning = setupStatuses.find((status) => status.status === 'running'); + if (hasError) { + // no need to trigger the next step if there is an error + setShowError(true); + return; + } + if (isRunning) { + // or something is already running... + return; + } + + const nextStep = setupStatuses.find((status) => status.status === 'pending'); + switch (nextStep?.stage) { + case 'install-dependencies': { + updateSetupStatus({ + stage: 'install-dependencies', + status: 'running', + message: 'Working hard to set everything up! This may take a while for the first time...' + }); + installDependencies(); + break; + } + case 'spawn-captain': { + updateSetupStatus({ + stage: 'spawn-captain', + status: 'running', + message: 'Almost there, starting Flojoy Studio...' + }); + spawnCaptain(); + break; + } + } + }, [setupStatuses]); + + useEffect(() => { + if (captainReady) { + navigate('/flow'); + } + }, [captainReady]); + return ( -
-

Welcome Home!

+
+
+
Welcome to Flojoy Studio!
+
+
+ We are excited to have you here, please give us some time to get everything ready :) +
+ +
+ +
+ {setupStatuses.map((status, idx) => ( + + ))} +
+ +
+ + {setupStatuses.find((status) => status.status === 'error') && ( + + )} + + + + + {errorTitle} + {errorDesc} + + + Cancel + {errorActionName} + + +
- ) -} + ); +}; diff --git a/src/renderer/src/routes/index/indexRoute.tsx b/src/renderer/src/routes/index/indexRoute.tsx deleted file mode 100644 index ce4d797..0000000 --- a/src/renderer/src/routes/index/indexRoute.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { lazyRouteComponent, Route, RootRoute } from '@tanstack/react-router' -import { rootRoute } from '@/routes/root/rootRoute' - -export const indexRoute = new Route({ - getParentRoute: (): RootRoute => rootRoute, - path: '/', - component: lazyRouteComponent(() => import('./Index'), 'Index') -}) diff --git a/src/renderer/src/routes/root/Root.tsx b/src/renderer/src/routes/root/Root.tsx index 5469b61..295f455 100644 --- a/src/renderer/src/routes/root/Root.tsx +++ b/src/renderer/src/routes/root/Root.tsx @@ -1,27 +1,15 @@ -import { ReactQueryDevtools } from '@tanstack/react-query-devtools' -import { Link, Outlet } from '@tanstack/react-router' -import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import StatusBar from '@/components/root/StatusBar'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { Outlet } from 'react-router-dom'; export const Root = (): JSX.Element => { return ( - <> -
- - Home - {' '} -
-
+
- - - - ) -} + + +
+ ); +}; -export const tanner = 'hello' +export const tanner = 'hello'; diff --git a/src/renderer/src/routes/root/rootRoute.tsx b/src/renderer/src/routes/root/rootRoute.tsx deleted file mode 100644 index f97a1a0..0000000 --- a/src/renderer/src/routes/root/rootRoute.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { RootRoute, RouterContext } from '@tanstack/react-router' -import { Root } from './Root' - -const routerContext = new RouterContext() - -export const rootRoute: RootRoute = routerContext.createRootRoute({ - component: Root -}) diff --git a/src/renderer/src/stores/lifecycle.ts b/src/renderer/src/stores/lifecycle.ts new file mode 100644 index 0000000..47a4f66 --- /dev/null +++ b/src/renderer/src/stores/lifecycle.ts @@ -0,0 +1,10 @@ +import { create } from 'zustand'; + +export interface CaptainState { + ready: boolean; + setReady: (state: boolean) => void; +} +export const useCaptainStateStore = create((set) => ({ + ready: false, + setReady: (state: boolean): void => set({ ready: state }) +})); diff --git a/src/renderer/src/styles/index.css b/src/renderer/src/styles/index.css index 6a75725..b822ff4 100644 --- a/src/renderer/src/styles/index.css +++ b/src/renderer/src/styles/index.css @@ -1,7 +1,7 @@ @tailwind base; @tailwind components; @tailwind utilities; - + @layer base { :root { --background: 0 0% 100%; @@ -9,63 +9,63 @@ --card: 0 0% 100%; --card-foreground: 222.2 84% 4.9%; - + --popover: 0 0% 100%; --popover-foreground: 222.2 84% 4.9%; - + --primary: 222.2 47.4% 11.2%; --primary-foreground: 210 40% 98%; - + --secondary: 210 40% 96.1%; --secondary-foreground: 222.2 47.4% 11.2%; - + --muted: 210 40% 96.1%; --muted-foreground: 215.4 16.3% 46.9%; - + --accent: 210 40% 96.1%; --accent-foreground: 222.2 47.4% 11.2%; - + --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; --ring: 222.2 84% 4.9%; - + --radius: 0.5rem; } - + .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; - + --card: 222.2 84% 4.9%; --card-foreground: 210 40% 98%; - + --popover: 222.2 84% 4.9%; --popover-foreground: 210 40% 98%; - + --primary: 210 40% 98%; --primary-foreground: 222.2 47.4% 11.2%; - + --secondary: 217.2 32.6% 17.5%; --secondary-foreground: 210 40% 98%; - + --muted: 217.2 32.6% 17.5%; --muted-foreground: 215 20.2% 65.1%; - + --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; - + --destructive: 0 62.8% 30.6%; --destructive-foreground: 210 40% 98%; - + --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 212.7 26.8% 83.9%; } } - + @layer base { * { @apply border-border; @@ -73,4 +73,17 @@ body { @apply bg-background text-foreground; } -} \ No newline at end of file +} + +body { + -webkit-app-region: drag; +} + +button { + -webkit-app-region: no-drag; +} + +.titlebar { + -webkit-user-select: none; + -webkit-app-region: drag; +} diff --git a/src/renderer/src/types/status.ts b/src/renderer/src/types/status.ts index fc077ac..c9bdc13 100644 --- a/src/renderer/src/types/status.ts +++ b/src/renderer/src/types/status.ts @@ -1,8 +1,14 @@ -import { z } from 'zod' +import { z } from 'zod'; -export const Status = z.object({ +export const BackendStatus = z.object({ status: z.enum(['OK', 'ERROR']), message: z.string() -}) +}); -export type Status = z.infer +export type BackendStatus = z.infer; + +export type SetupStatus = { + status: 'running' | 'completed' | 'pending' | 'error'; + stage: 'check-python-installation' | 'install-dependencies' | 'spawn-captain'; + message: string; +}; diff --git a/src/renderer/src/utils/style.ts b/src/renderer/src/utils/style.ts index 8dff152..edac9f2 100644 --- a/src/renderer/src/utils/style.ts +++ b/src/renderer/src/utils/style.ts @@ -1,6 +1,6 @@ -import { type ClassValue, clsx } from 'clsx' -import { twMerge } from 'tailwind-merge' +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]): string { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/tailwind.config.js b/tailwind.config.js index 0377ea1..5c30120 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,76 +1,76 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - darkMode: ["class"], + darkMode: ['class'], content: [ './pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', - ], + './src/**/*.{ts,tsx}' + ], theme: { container: { center: true, - padding: "2rem", + padding: '2rem', screens: { - "2xl": "1400px", - }, + '2xl': '1400px' + } }, extend: { colors: { - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' }, secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' }, destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' }, muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' }, accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' }, popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' }, card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + } }, borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' }, keyframes: { - "accordion-down": { + 'accordion-down': { from: { height: 0 }, - to: { height: "var(--radix-accordion-content-height)" }, - }, - "accordion-up": { - from: { height: "var(--radix-accordion-content-height)" }, - to: { height: 0 }, + to: { height: 'var(--radix-accordion-content-height)' } }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: 0 } + } }, animation: { - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", - }, - }, + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out' + } + } }, - plugins: [require("tailwindcss-animate")], -} \ No newline at end of file + plugins: [require('tailwindcss-animate')] +};