From 2c329aa8a20f0ba7580380450cf6d6db5c7bfb05 Mon Sep 17 00:00:00 2001 From: Anthony Janin Date: Thu, 5 Jun 2025 09:40:35 +0200 Subject: [PATCH] Initial commit --- .gitignore | 24 + README.md | 54 + eslint.config.js | 28 + index.html | 13 + package-lock.json | 2286 ++++++++++++++++++++++++++++ package.json | 31 + public/vite.svg | 1 + src/App.css | 1137 ++++++++++++++ src/App.tsx | 203 +++ src/assets/react.svg | 1 + src/components/ControlPanel.tsx | 81 + src/components/FolderModal.css | 294 ++++ src/components/FolderModal.tsx | 337 ++++ src/components/MessageConsole.tsx | 137 ++ src/components/ProcessesViewer.css | 174 +++ src/components/ProcessesViewer.tsx | 162 ++ src/components/ProfileModal.css | 174 +++ src/components/ProfileModal.tsx | 181 +++ src/components/modal/Modal.css | 163 ++ src/components/modal/Modal.tsx | 38 + src/index.css | 68 + src/main.tsx | 10 + src/sdk/AuthModal.tsx | 101 ++ src/sdk/EventBus.ts | 33 + src/sdk/Iframe.tsx | 32 + src/sdk/IframeReference.ts | 13 + src/sdk/Loader.tsx | 23 + src/sdk/MessageBus.ts | 422 +++++ src/sdk/UserStrore.ts | 34 + src/sdk/models/FolderData.ts | 14 + src/sdk/models/ProfileData.ts | 11 + src/vite-env.d.ts | 1 + tsconfig.app.json | 27 + tsconfig.json | 7 + tsconfig.node.json | 25 + vite.config.ts | 7 + 36 files changed, 6347 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/components/ControlPanel.tsx create mode 100644 src/components/FolderModal.css create mode 100644 src/components/FolderModal.tsx create mode 100644 src/components/MessageConsole.tsx create mode 100644 src/components/ProcessesViewer.css create mode 100644 src/components/ProcessesViewer.tsx create mode 100644 src/components/ProfileModal.css create mode 100644 src/components/ProfileModal.tsx create mode 100644 src/components/modal/Modal.css create mode 100644 src/components/modal/Modal.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/sdk/AuthModal.tsx create mode 100644 src/sdk/EventBus.ts create mode 100644 src/sdk/Iframe.tsx create mode 100644 src/sdk/IframeReference.ts create mode 100644 src/sdk/Loader.tsx create mode 100644 src/sdk/MessageBus.ts create mode 100644 src/sdk/UserStrore.ts create mode 100644 src/sdk/models/FolderData.ts create mode 100644 src/sdk/models/ProfileData.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..da98444 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bab1924 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2286 @@ +{ + "name": "skeleton", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "skeleton", + "version": "0.0.0", + "dependencies": { + "@types/uuid": "^10.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "uuid": "^11.1.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.3", + "@babel/parser": "^7.27.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.3", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.27.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@rolldown/pluginutils": "1.0.0-beta.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.158", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.41.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/utils": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8bbe2f3 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "skeleton", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@types/uuid": "^10.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "uuid": "^11.1.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..e948a78 --- /dev/null +++ b/src/App.css @@ -0,0 +1,1137 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); + +:root { + /* Nouvelle palette principale */ + --primary-color: #7F5AF0; + --primary-dark: #6941E0; + --primary-light: #9C7CF7; + --secondary-color: #2CB67D; + --accent-color: #FF8906; + + /* Couleurs de statut */ + --success-color: #2CB67D; + --error-color: #F25F5C; + --warning-color: #FFC857; + + /* Palette sombre - Dark mode */ + --surface-100: #16161A; + --surface-200: #242629; + --surface-300: #2E2F35; + --surface-400: #3D3E44; + + /* Texte et contenu */ + --text-100: #FFFFFE; + --text-200: #94A1B2; + --text-300: #72757E; + + /* Ombres adaptées au mode sombre */ + --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.2); + --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.4); + + /* Arrondis */ + --radius-sm: 6px; + --radius-md: 12px; + --radius-lg: 18px; + --radius-xl: 24px; + + /* Transitions fluides */ + --transition-fast: 0.15s ease; + --transition-normal: 0.25s ease; + --transition-slow: 0.4s ease; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, body, #root { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + overflow-x: hidden; + color: var(--text-100); + background-color: var(--surface-100); + line-height: 1.6; +} + +.home-container { + display: flex; + flex-direction: column; + min-height: 100vh; + width: 100%; + background: linear-gradient(135deg, var(--surface-100) 0%, var(--surface-200) 100%); + position: relative; + overflow: hidden; +} + +/* Éléments décoratifs de fond */ +.home-container::before, +.home-container::after { + content: ''; + position: absolute; + width: 400px; + height: 400px; + border-radius: 50%; + opacity: 0.08; + z-index: 0; + filter: blur(80px); + transition: all var(--transition-slow); +} + +.home-container::before { + background: var(--primary-light); + top: -150px; + right: -150px; +} + +.home-container::after { + background: var(--secondary-color); + bottom: -150px; + left: -150px; +} + +.home-header { + padding: 1.2rem 2rem; + background: var(--surface-200); + border-bottom: 1px solid var(--surface-300); + color: var(--text-100); + text-align: center; + box-shadow: var(--shadow-md); + position: relative; + z-index: 1; + backdrop-filter: blur(10px); +} + +.home-header h1 { + margin: 0; + font-size: 1.5rem; + font-weight: 700; + letter-spacing: -0.5px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.home-main { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + padding: 2rem; + width: 100%; + position: relative; + z-index: 1; +} + +.welcome-section { + width: 100%; + max-width: 1400px; + /* Hauteur adaptative pour s'adapter au contenu, y compris la console */ + height: auto; + padding: 2rem; + background-color: var(--surface-200); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + text-align: center; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin: 0 auto; + position: relative; + overflow: hidden; + border: 1px solid var(--surface-300); +} + +/* Styles de base pour les sections */ +.welcome-section p { + color: var(--neutral-600); + margin-bottom: 2rem; + line-height: 1.7; + font-size: 1.1rem; + font-weight: 400; +} + +/* Styles des messages - section supprimée car plus utilisée */ + +/* Animation fadeIn supprimée */ + +.status-message::before { + content: ''; + position: absolute; + top: 0; + left: 0; + height: 4px; + width: 100%; + z-index: 1; +} + +.status-message h3 { + margin-top: 0; + margin-bottom: 1.5rem; + font-size: 1.6rem; + font-weight: 600; + color: var(--neutral-800); + position: relative; +} + +.status-message p { + margin-bottom: 1.5rem; + line-height: 1.6; + font-size: 1.05rem; +} + +/* Message de succès */ +.status-message.success { + color: var(--success-color); +} + +.status-message.success h3 { + color: var(--success-color); +} + +/* Bouton de réinitialisation */ +.reset-button { + background: linear-gradient(45deg, var(--neutral-600), var(--neutral-700)); + color: var(--neutral-100); + border: none; + border-radius: var(--radius-xl); + padding: 0.8rem 2.2rem; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + box-shadow: var(--shadow-md); + margin-top: 1.5rem; + position: relative; + letter-spacing: 0.5px; +} + +/* Élément before supprimé */ + +.reset-button:hover { + background: linear-gradient(45deg, var(--neutral-700), var(--neutral-800)); + box-shadow: var(--shadow-lg); +} + +/* Effet hover before supprimé */ + +.reset-button:active { + box-shadow: var(--shadow-sm); +} + +/* Désactiver le défilement quand l'iframe est affiché */ +body.iframe-active { + overflow: hidden; +} + +/* Styles pour l'auth inline - anciennes classes overlay supprimées */ + +/* Styles pour le composant ExternalFrame */ +.external-frame-container { + display: flex; + flex-direction: column; + width: 100%; + height: 640px; + gap: 12px; + margin: 0 auto; +} + +/* Container pour l'iframe et la console */ +.frames-container { + display: flex; + flex: 1; + gap: 16px; + width: 100%; + height: 500px; /* Hauteur fixe pour le conteneur */ +} + +/* Conteneur principal de l'iframe et de la console */ +.external-frame-container { + display: flex; + flex-direction: column; + width: 100%; + gap: 16px; + /* Prendre toute la hauteur disponible */ + flex: 1; +} + +/* Section de l'iframe */ +.iframe-section { + position: relative; + flex: 3; + display: flex; + flex-direction: column; + background-color: var(--surface-300); + border-radius: var(--radius-md); + overflow: hidden; + box-shadow: var(--shadow-md); + border: 1px solid var(--surface-400); + transition: all var(--transition-normal); +} + +/* Styles pour le loader de l'iframe */ +.iframe-loader { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: rgba(22, 22, 26, 0.85); + backdrop-filter: blur(3px); + z-index: 10; + border-radius: var(--radius-md); + overflow: hidden; +} + +.iframe-loader p { + margin-top: 1.5rem; + color: var(--text-100); + font-size: 0.9rem; + font-weight: 500; +} + +.message-timestamp { + color: var(--text-300); + font-size: 0.75rem; + margin-bottom: 5px; + padding: 2px 6px; + display: inline-block; + font-family: monospace; + letter-spacing: 0.5px; +} + +/* Animation du spinner */ +.spinner { + width: 40px; + height: 40px; + border: 3px solid rgba(255, 255, 255, 0.1); + border-radius: 50%; + border-top-color: var(--primary-color); + animation: spin 1s ease-in-out infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* Conteneur des boutons */ +.register-button-container { + display: flex; + justify-content: flex-start; + gap: 10px; /* Espacement entre les boutons */ + background-color: transparent; +} + +/* Ligne de séparation */ +.section-divider { + width: 100%; + border: none; + border-top: 1px solid var(--neutral-300); + margin: 0 0 8px 0; +} + +/* Bouton d'enregistrement */ +.register-button { + background: var(--primary-color); + color: var(--text-100); + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 2rem; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + box-shadow: var(--shadow-md); + transition: all var(--transition-fast); + text-transform: uppercase; + letter-spacing: 0.5px; + position: relative; + overflow: hidden; +} + +.register-button::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transform: translateX(-100%); + transition: all 0.6s ease; +} + +.register-button:hover { + background: var(--primary-dark); + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.register-button:hover::before { + transform: translateX(100%); +} + +.register-button:active { + transform: translateY(0); + box-shadow: var(--shadow-sm); +} + +/* Style pour le bouton désactivé */ +.register-button.disabled { + background: var(--surface-400); + color: var(--text-200); + border: 1px solid var(--surface-300); + cursor: not-allowed; + opacity: 0.9; + box-shadow: none; + transform: none; + position: relative; +} + +.register-button.disabled::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: repeating-linear-gradient( + 45deg, + transparent, + transparent 5px, + rgba(0, 0, 0, 0.05) 5px, + rgba(0, 0, 0, 0.05) 10px + ); + border-radius: var(--radius-md); + pointer-events: none; +} + +.register-button.disabled:hover { + background: var(--surface-400); + transform: none; + box-shadow: none; + border: 1px solid var(--surface-300); +} + +/* Style pour le bouton de basculement d'iframe */ +.toggle-iframe-button { + background: var(--secondary-color); + color: var(--text-100); + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 2rem; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + box-shadow: var(--shadow-md); + transition: all var(--transition-fast); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-left: 10px; + position: relative; + overflow: hidden; +} + +.toggle-iframe-button::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transform: translateX(-100%); + transition: all 0.6s ease; +} + +.toggle-iframe-button:hover { + background: #26a06f; /* Variante plus foncée de la couleur secondaire */ + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.toggle-iframe-button:hover::before { + transform: translateX(100%); +} + +.toggle-iframe-button:active { + transform: translateY(0); + box-shadow: var(--shadow-sm); +} + +/* Panneau console */ +.console-panel { + flex: 1; + width: 100%; /* 100% de la largeur du conteneur parent (300px) */ + height: 100%; /* Utiliser 100% de la hauteur du conteneur parent */ + display: flex; + flex-direction: column; + background-color: var(--surface-300); + border-radius: var(--radius-lg); + overflow: hidden; + border: 1px solid var(--surface-400); + box-shadow: var(--shadow-lg); + color: var(--text-100); + transition: all var(--transition-normal); +} + +/* Console en pleine largeur quand l'iframe est masquée */ +.console-panel.full-width { + max-width: 100%; + width: 100%; +} + +/* En-tête du panneau console */ +.console-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 16px; + background-color: var(--surface-400); + border-bottom: 1px solid rgba(255, 255, 255, 0.05); +} + +.console-controls { + display: flex; + align-items: center; + gap: 8px; +} + +.console-header h3 { + margin: 0; + font-size: 0.95rem; + font-weight: 600; + color: var(--text-100); + display: flex; + align-items: center; + gap: 6px; +} + +.console-header h3::before { + content: ''; + display: inline-block; + width: 8px; + height: 8px; + background-color: var(--accent-color); + border-radius: 50%; +} + +.message-count { + font-size: 0.8rem; + font-weight: 500; + color: var(--text-200); + background-color: var(--surface-200); + padding: 3px 10px; + border-radius: 12px; + border: 1px solid var(--surface-300); +} + +.clear-console-button { + background-color: transparent; + border: none; + border-radius: var(--radius-sm); + width: 30px; + height: 30px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + color: var(--text-200); + transition: all var(--transition-fast); +} + +.clear-console-button:hover { + background-color: var(--surface-300); + color: var(--accent-color); +} + +.clear-console-button:active { + transform: scale(0.95); +} + +.clear-console-button:disabled { + opacity: 0.3; + cursor: not-allowed; +} + +.clear-console-button:disabled:hover { + background-color: transparent; + color: var(--neutral-400); +} + +/* Contenu du panneau console */ +.console-content { + flex: 1; + height: calc(100% - 45px); /* Hauteur calculée en fonction de l'en-tête */ + overflow-y: auto; + padding: 0; + font-family: 'JetBrains Mono', 'Consolas', 'Monaco', monospace; + font-size: 0.85rem; + text-align: left; + background-color: var(--surface-200); + scrollbar-width: thin; + scrollbar-color: var(--surface-400) var(--surface-200); + display: block; +} + +/* Styles pour les scrollbars dans Webkit (Chrome, Safari, etc.) */ +.console-content::-webkit-scrollbar { + width: 8px; +} + +.console-content::-webkit-scrollbar-track { + background: var(--surface-400); +} + +.console-content::-webkit-scrollbar-thumb { + background-color: var(--surface-200); + border-radius: 4px; +} + +.console-content::-webkit-scrollbar-thumb:hover { + background-color: var(--surface-300); +} + +.no-messages { + padding: 2rem; + color: var(--text-300); + font-style: italic; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + background: var(--surface-200); + border-radius: var(--radius-md); +} + +.message-list { + list-style: none; + padding: 0; + margin: 0; + background: var(--surface-200); +} + +.message-item { + padding: 12px 16px; + border-bottom: 1px solid var(--surface-300); + transition: background-color var(--transition-fast); +} + +.message-item:nth-child(even) { + background-color: var(--surface-300); +} + +.message-item:hover { + background-color: var(--surface-400); +} + +.message-timestamp { + font-size: 0.75rem; + color: var(--text-300); + margin-bottom: 6px; + display: flex; + align-items: center; + gap: 4px; +} + +.message-timestamp::before { + content: '⏱'; + font-size: 0.7rem; + opacity: 0.7; +} + +.message-data { + margin: 0; + white-space: pre-wrap; + word-break: break-word; + color: var(--text-100); + background-color: var(--surface-300); + height: auto; + max-height: none; + overflow: visible; + padding: 8px 12px; + border-radius: var(--radius-sm); + border-left: 2px solid var(--primary-color); + text-align: left; + line-height: 1.5; + font-size: 0.8rem; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05); +} + +/* Styles de l'iframe */ +.auth-iframe { + width: 100%; + height: 100%; + border: none; + background-color: var(--surface-100); + flex: 1; + transition: opacity var(--transition-normal), transform var(--transition-normal); +} + +/* Classe pour masquer l'iframe */ +.iframe-section.hidden { + display: none; +} + +/* Bouton pour fermer l'iframe - supprimé car plus utilisé */ + +/* Données de réponse */ +.response-data { + background-color: var(--neutral-200); + border-radius: var(--radius-md); + padding: 1.2rem; + margin: 1rem 0; + text-align: left; + border-left: 4px solid var(--success-color); + box-shadow: var(--shadow-sm); +} + +.response-data p { + margin: 0.6rem 0; + color: var(--neutral-700); + font-size: 0.95rem; + display: flex; + align-items: baseline; + line-height: 1.5; +} + +.response-data p strong { + color: var(--neutral-800); + margin-right: 0.5rem; + min-width: 60px; +} + +.home-footer { + padding: 1.5rem; + background: linear-gradient(90deg, var(--neutral-800), var(--neutral-900)); + color: var(--neutral-100); + text-align: center; + font-size: 0.9rem; + position: relative; + z-index: 1; +} + +/* Style pour le conteneur de la console de messages */ +.message-console-container { + display: flex; + flex-direction: column; + width: 300px; /* Largeur fixe de 300px */ + height: 800px; /* Hauteur fixe de 800px */ + margin: 0; /* Supprimer la marge pour aligner correctement */ +} + +/* Styles responsifs */ +@media (max-width: 1400px) { + .welcome-section { + max-width: 90%; + margin: 0 auto; + } +} + +@media (max-width: 768px) { + .home-main { + padding: 1.2rem; + } + + .welcome-section { + padding: 1.2rem; + min-height: 500px; + border-radius: var(--radius-md); + } + + /* Styles de bouton login supprimés car plus utilisés */ + + .status-message h3 { + font-size: 1.4rem; + } + + .spinner { + width: 36px; + height: 36px; + margin: 20px auto; + } + + /* Modification du layout pour les tablettes */ + /* Styles de iframe-wrapper supprimés car plus utilisés */ + + .external-frame-container { + flex-direction: column; + height: auto; + gap: 12px; + width: 100%; + } + + .iframe-section { + height: 400px; + min-height: 350px; + border-radius: var(--radius-md); + } + + /* Styles de iframe-container supprimés car plus utilisés */ + + .console-panel { + flex: 1; + max-width: none; + min-width: auto; + height: 400px; /* Même hauteur que l'iframe */ + } + + .console-content { + height: calc(100% - 40px); /* Maintenir la même logique que sur desktop */ + } + + .message-data { + max-height: 120px; + } +} + +/* Mise en page avec console à gauche et contenu à droite */ +.app-content-layout { + display: flex; + flex-direction: row; + width: 100%; + margin-top: 20px; + gap: 20px; + height: 800px; /* Même hauteur que la console */ +} + +/* Zone de contenu à droite de la console */ +.content-area { + flex: 1; + height: 100%; + background-color: var(--surface-300); + border-radius: var(--radius-lg); + border: 1px solid var(--surface-400); + box-shadow: var(--shadow-md); + overflow: auto; + padding: 20px; +} + +/* Placeholder pour le contenu */ +.placeholder-content { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + color: var(--text-200); +} + +.placeholder-content h3 { + margin-bottom: 10px; + color: var(--text-100); +} + +.placeholder-content p { + max-width: 400px; + line-height: 1.6; +} + +/* Styles pour l'infobulle */ +.url-tooltip-container { + position: relative; + display: inline-block; + margin: 0; /* Suppression de toutes les marges */ + padding: 0; /* Suppression de tout padding */ +} + +.info-button { + background-color: transparent; + color: white; + border: none; + font-weight: normal; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + font-size: 20px; /* Taille de police légèrement plus grande pour l'emoticon */ + transition: all 0.2s ease; + padding: 5px; + line-height: 1; +} + +.info-button:hover { + opacity: 0.8; /* Légère transparence au survol */ + transform: scale(1.05); + box-shadow: var(--shadow-md); +} + +.url-tooltip { + position: absolute; + top: 100%; + left: 0; + margin-top: 5px; + background-color: var(--surface-400); + color: var(--text-100); + padding: 8px 12px; + border-radius: var(--radius-md); + font-size: 0.8rem; + white-space: nowrap; + z-index: 10; + box-shadow: var(--shadow-md); + border: 1px solid var(--surface-500); + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(-5px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Panel de contrôle */ +.control-panel-container { + display: flex; + flex-direction: column; + align-items: flex-start; + width: 100%; +} + +/* Rangée de boutons dans le panel de contrôle */ +.control-panel-row { + display: flex; + align-items: center; + justify-content: flex-start; + width: 100%; + gap: 20px; /* Espacement horizontal uniforme entre tous les éléments */ + padding: 10px; + background-color: var(--surface-200); + border-radius: var(--radius-md); + box-shadow: var(--shadow-sm); + flex-wrap: nowrap; /* Empêche le retour à la ligne */ +} + +.control-buttons { + display: flex; + gap: 10px; + flex-wrap: wrap; + justify-content: center; +} + +/* Conteneur commun pour tous les boutons */ +.button-container { + display: flex; + align-items: center; + justify-content: center; +} + +/* Style des boutons de contrôle */ +.control-button { + min-width: 120px; /* Largeur minimale pour les boutons */ + margin: 0; /* Supprime toutes les marges */ + background: var(--primary-color); + color: var(--text-100); + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 2rem; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + box-shadow: var(--shadow-md); + transition: all var(--transition-normal); + position: relative; + overflow: hidden; +} + +.control-button::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: transform var(--transition-slow); + z-index: 1; +} + +/* Style par défaut pour les boutons de contrôle - Basé sur register-button */ +.control-button { + background: var(--primary-color); + color: var(--text-100); + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 2rem; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + box-shadow: var(--shadow-md); + transition: all var(--transition-fast); + letter-spacing: 0.5px; + position: relative; + overflow: hidden; +} + +/* Effet de lueur au survol */ +.control-button::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transform: translateX(-100%); + transition: all 0.6s ease; +} + +/* Style de base pour tous les boutons de contrôle au survol */ +.control-button:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +.control-button:hover::before { + transform: translateX(100%); +} + +.control-button:active { + transform: translateY(0); + box-shadow: var(--shadow-sm); +} + +/* Style spécifique pour le bouton de connexion au survol */ +.control-button:not(.logout-button):hover { + background: var(--primary-color-dark); +} + +/* Style spécifique pour le bouton de déconnexion */ +.logout-button { + background-color: #e53935; /* Rouge */ + color: white; +} + +/* Style spécifique pour le bouton de déconnexion au survol */ +.logout-button:hover { + background-color: #c62828; /* Rouge plus foncé au survol */ +} + +.control-button:hover::before { + transform: translateX(100%); +} + +.control-button:active { + transform: translateY(0); + box-shadow: var(--shadow-sm); +} + +.control-button.disabled { + background: var(--surface-400); + color: var(--text-200); + border: 1px solid var(--surface-300); + cursor: not-allowed; + opacity: 0.9; + box-shadow: none; + transform: none; + position: relative; +} + +.control-button.disabled::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: repeating-linear-gradient( + 45deg, + transparent, + transparent 5px, + rgba(0, 0, 0, 0.05) 5px, + rgba(0, 0, 0, 0.05) 10px + ); +} + +@media (max-width: 480px) { + .home-container::before, + .home-container::after { + width: 200px; + height: 200px; + } + + .home-header { + padding: 1.2rem 1rem; + } + + .home-header h1 { + font-size: 1.5rem; + } + + .welcome-section { + padding: 1rem; + margin: 0 0.5rem; + border-radius: var(--radius-sm); + min-height: 600px; + } + + .welcome-section p { + font-size: 1rem; + margin-bottom: 1.5rem; + } + + /* Styles de login-button supprimés car plus utilisés */ + + .reset-button { + padding: 0.6rem 1.6rem; + font-size: 0.9rem; + } + + /* Ajustements pour mobile */ + .iframe-overlay { + padding: 10px; + } + + /* Styles de iframe-wrapper supprimés car plus utilisés */ + + .external-frame-container { + flex-direction: column; + height: auto; + gap: 8px; + } + + .iframe-section { + height: 300px; + min-height: 250px; + border-radius: var(--radius-sm); + } + + /* Styles de iframe-container supprimés car plus utilisés */ + + .console-panel { + height: 300px; /* Même hauteur que l'iframe */ + max-width: none; + min-width: auto; + } + + .console-content { + height: calc(100% - 40px); /* Hauteur calculée en fonction de l'en-tête */ + } + + .console-header { + padding: 8px 12px; + } + + .console-header h3 { + font-size: 0.85rem; + } + + .message-data { + max-height: 100px; + font-size: 0.75rem; + } + + .message-item { + padding: 6px 8px; + } + + .response-data { + padding: 1rem; + } + + /* Styles de close-iframe-button supprimés car plus utilisés */ +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..4f63a2a --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,203 @@ +import { useState, useEffect, useCallback } from 'react' +import './App.css' + +import MessageConsole from './components/MessageConsole' +import ControlPanel from './components/ControlPanel' +import ProfileModal from './components/ProfileModal' +import AuthModal from './sdk/AuthModal'; +import MessageBus from './sdk/MessageBus'; +import EventBus from './sdk/EventBus'; +import UserStore from './sdk/UserStrore'; +import Iframe from './sdk/Iframe' +import BlockchainViewer from './components/ProcessesViewer'; +import FolderModal from './components/FolderModal'; +import type { ProfileData } from './sdk/models/ProfileData' +import type { FolderData } from './sdk/models/FolderData' + +const iframeUrl = 'https://dev3.4nkweb.com' + +function App() { + const [receivedMessages, setReceivedMessages] = useState<{ timestamp: string; data: any }[]>([]) + const [isConnected, setIsConnected] = useState(false) + const [showProfileModal, setShowProfileModal] = useState(false) + const [showAuthModal, setShowAuthModal] = useState(false) + const [showFolderModal, setShowFolderModal] = useState(false) + const [processes, setProcesses] = useState(null) + + useEffect(() => { + setIsConnected(UserStore.getInstance().isConnected()); + }); + + useEffect(() => { + if (isConnected) { + const messageBus = MessageBus.getInstance(iframeUrl); + messageBus.isReady().then(() => { + messageBus.getProcesses().then((processes: any) => { + setProcesses(processes); + + for (const key of Object.keys(processes)) { + try { + const process = processes[key]; + if (Object.keys(process.states?.[0]?.keys).length === 0) { + continue; + } + + + console.log(key); + console.log(process); + + + } catch (error) { + console.error('Failed to retrieve data:', error); + } + } + + messageBus.getData('467b005278cf516a42a54ba777fcbab29748072b52c01a988a596662e7b7844a:0', 'ada06b5c6e5add8a281b284a31a258355b33a9f0dbc4a5dcfe77dfd4eb904011').then((data: any) => { + console.log(data); + }); + }); + }); + } + }, [isConnected, iframeUrl]); + + // Gestionnaire pour afficher la modale de connexion + const handleLogin = useCallback(() => { + // Afficher la modale de connexion + setShowAuthModal(true); + }, []); + + // Gestionnaire pour la déconnexion + const handleLogout = useCallback(() => { + // Déconnecter l'utilisateur + UserStore.getInstance().disconnect(); + setIsConnected(false); + + // Émettre un événement pour vider aussi les messages locaux dans MessageConsole + EventBus.getInstance().emit('CLEAR_CONSOLE'); + + // Vider les processes + setProcesses(null); + }, []); + + // Gestionnaire pour ouvrir la modale de profil + const handleOpenProfileModal = useCallback(() => { + setShowProfileModal(true); + }, []); + + // Gestionnaire pour ouvrir la modale de création de dossier + const handleOpenFolderModal = useCallback(() => { + setShowFolderModal(true); + }, []); + + // Gestionnaire pour fermer la modale de création de dossier + const handleCloseFolderModal = useCallback(() => { + setShowFolderModal(false); + }, []); + + // Gestionnaire pour fermer la modale de création de profil + const handleCloseProfileModal = useCallback(() => { + setShowProfileModal(false); + }, []); + + // Gestionnaire pour soumettre les données du profil + const handleProfileSubmit = useCallback((profileData: ProfileData) => { + // Ajouter le validator fixe aux données du profil + const completeProfileData = { + ...profileData, + validator: '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0' + }; + + MessageBus.getInstance(iframeUrl).createProfile(completeProfileData).then((_profileData: ProfileData) => { + MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => { + setProcesses(processes); + }); + }); + + setShowProfileModal(false); + }, []); + + // Gestionnaire pour soumettre les données du dossier + const handleFolderSubmit = useCallback((folderData: FolderData) => { + MessageBus.getInstance(iframeUrl).createFolder(folderData).then((_folderData: FolderData) => { + MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => { + setProcesses(processes); + }); + }); + + setShowFolderModal(false); + }, []); + + // Gestionnaire du clic sur le bouton Vider les messages + const handleClearMessages = useCallback(() => { + setReceivedMessages([]); + }, []); + + return ( +
+
+

[4NK]

+
+ +
+
+ {/* Panneau de contrôle avec iframe */} + + + {/* Structure flexible avec console à gauche et contenu à droite */} +
+ {/* Console de messages (largeur fixe à gauche) */} + + + {/* Espace pour contenu supplémentaire à droite */} +
+ {/* Affichage des blocs de la blockchain */} + +
+
+ + {/* Modales */} + {showAuthModal && ( + { + setIsConnected(true); + setShowAuthModal(false); + }} + onClose={() => setShowAuthModal(false)} + iframeUrl={iframeUrl} + /> + )} + {showProfileModal && ( + + )} + {showFolderModal && ( + + )} + + {/* N'afficher l'iframe que si l'utilisateur est connecté */} + {isConnected &&