From 2e396f32b9605a18b03922745a0277006823a715 Mon Sep 17 00:00:00 2001 From: arifal Date: Tue, 12 Aug 2025 17:51:40 +0700 Subject: [PATCH] initial --- .gitignore | 24 + README.md | 69 + eslint.config.js | 23 + index.html | 15 + package-lock.json | 4798 +++++++++++++++++++++++++++++ package.json | 36 + postcss.config.js | 6 + public/claim-guard.ico | Bin 0 -> 140206 bytes public/claim-guard.svg | 1 + src/App.tsx | 59 + src/assets/claim-guard.jpeg | Bin 0 -> 7906 bytes src/components/Layout.tsx | 94 + src/components/ProtectedRoute.tsx | 15 + src/components/Sidebar.tsx | 308 ++ src/index.css | 44 + src/main.tsx | 10 + src/pages/BPJSCode.tsx | 675 ++++ src/pages/BPJSSync.tsx | 461 +++ src/pages/CostRecommendation.tsx | 681 ++++ src/pages/Dashboard.tsx | 339 ++ src/pages/Login.tsx | 318 ++ src/pages/MedicalRecord.tsx | 470 +++ src/pages/MedicalRecordSync.tsx | 552 ++++ src/pages/NotFound.tsx | 158 + src/pages/NotFoundProtected.tsx | 114 + src/pages/Patients.tsx | 284 ++ src/pages/RoleManagement.tsx | 464 +++ src/pages/UserManagement.tsx | 523 ++++ src/types/roles.ts | 400 +++ src/vite-env.d.ts | 1 + tailwind.config.js | 30 + tsconfig.app.json | 27 + tsconfig.json | 7 + tsconfig.node.json | 25 + vite.config.ts | 7 + 35 files changed, 11038 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 postcss.config.js create mode 100644 public/claim-guard.ico create mode 100644 public/claim-guard.svg create mode 100644 src/App.tsx create mode 100644 src/assets/claim-guard.jpeg create mode 100644 src/components/Layout.tsx create mode 100644 src/components/ProtectedRoute.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/BPJSCode.tsx create mode 100644 src/pages/BPJSSync.tsx create mode 100644 src/pages/CostRecommendation.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Login.tsx create mode 100644 src/pages/MedicalRecord.tsx create mode 100644 src/pages/MedicalRecordSync.tsx create mode 100644 src/pages/NotFound.tsx create mode 100644 src/pages/NotFoundProtected.tsx create mode 100644 src/pages/Patients.tsx create mode 100644 src/pages/RoleManagement.tsx create mode 100644 src/pages/UserManagement.tsx create mode 100644 src/types/roles.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js 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..7959ce4 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# 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([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // 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, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +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([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..d94e7de --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,23 @@ +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' +import { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 0000000..491016c --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + + + ClaimGuard - Hospital Management System + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..338de72 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4798 @@ +{ + "name": "claim-guard-fe", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "claim-guard-fe", + "version": "0.0.0", + "dependencies": { + "clsx": "^2.1.1", + "lucide-react": "^0.469.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.54.2", + "react-router-dom": "^6.30.0" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^5.0.0", + "autoprefixer": "^10.4.21", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "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", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "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.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "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.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "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-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "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", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "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.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "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/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "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", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "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.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "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", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "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", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "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", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "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.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "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", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "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", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "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", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.30.tgz", + "integrity": "sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "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", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", + "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/type-utils": "8.39.1", + "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.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.39.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", + "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.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": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.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/tsconfig-utils": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", + "dev": true, + "license": "MIT", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", + "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", + "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.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.39.1", + "eslint-visitor-keys": "^4.2.1" + }, + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.0.tgz", + "integrity": "sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.30", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", + "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.30001733", + "electron-to-chromium": "^1.5.199", + "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", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001734", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz", + "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==", + "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", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "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", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.200", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz", + "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", + "@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.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.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", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "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", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "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.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "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.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "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", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "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", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.469.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz", + "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-hook-form": { + "version": "7.62.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", + "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.46.2", + "@rollup/rollup-android-arm64": "4.46.2", + "@rollup/rollup-darwin-arm64": "4.46.2", + "@rollup/rollup-darwin-x64": "4.46.2", + "@rollup/rollup-freebsd-arm64": "4.46.2", + "@rollup/rollup-freebsd-x64": "4.46.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", + "@rollup/rollup-linux-arm64-gnu": "4.46.2", + "@rollup/rollup-linux-arm64-musl": "4.46.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-musl": "4.46.2", + "@rollup/rollup-linux-s390x-gnu": "4.46.2", + "@rollup/rollup-linux-x64-gnu": "4.46.2", + "@rollup/rollup-linux-x64-musl": "4.46.2", + "@rollup/rollup-win32-arm64-msvc": "4.46.2", + "@rollup/rollup-win32-ia32-msvc": "4.46.2", + "@rollup/rollup-win32-x64-msvc": "4.46.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "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.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.1.tgz", + "integrity": "sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.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 <6.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.2.tgz", + "integrity": "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "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.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "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..3624faa --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "claim-guard-fe", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.30.0", + "react-hook-form": "^7.54.2", + "lucide-react": "^0.469.0", + "clsx": "^2.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^5.0.0", + "autoprefixer": "^10.4.21", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/claim-guard.ico b/public/claim-guard.ico new file mode 100644 index 0000000000000000000000000000000000000000..95ae9fcc25ceb1ee176c1ec0828f70ad71e46511 GIT binary patch literal 140206 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

ez!W@T#F~oeAv2r}~pdHLJ<14v0OeW@-lYw6p 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%0DsMs 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 \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..215e3c0 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,59 @@ +import { + BrowserRouter as Router, + Routes, + Route, + Navigate, +} from "react-router-dom"; +import Login from "./pages/Login"; +import Dashboard from "./pages/Dashboard"; +import Patients from "./pages/Patients"; +import MedicalRecord from "./pages/MedicalRecord"; +import CostRecommendation from "./pages/CostRecommendation"; +import BPJSSync from "./pages/BPJSSync"; +import BPJSCode from "./pages/BPJSCode"; +import MedicalRecordSync from "./pages/MedicalRecordSync"; +import UserManagement from "./pages/UserManagement"; +import RoleManagement from "./pages/RoleManagement"; +import NotFound from "./pages/NotFound"; +import NotFoundProtected from "./pages/NotFoundProtected"; +import Layout from "./components/Layout"; +import ProtectedRoute from "./components/ProtectedRoute"; + +function App() { + return ( + + + } /> + + + + } + > + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + + } /> + } /> + } /> + {/* Protected 404 - untuk route di dalam layout sidebar */} + } /> + + {/* Public 404 - untuk route umum yang tidak dilindungi */} + } /> + + + ); +} + +export default App; diff --git a/src/assets/claim-guard.jpeg b/src/assets/claim-guard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..82085238ece0f717cac8e6090a25bc7934f113f6 GIT binary patch literal 7906 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 P-PuPWN7y;(dg^}xg&Q95 literal 0 HcmV?d00001 diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx new file mode 100644 index 0000000..6cac135 --- /dev/null +++ b/src/components/Layout.tsx @@ -0,0 +1,94 @@ +import { useState } from "react"; +import { Outlet } from "react-router-dom"; +import Sidebar from "./Sidebar"; +import { Bell, Menu } from "lucide-react"; + +export default function Layout() { + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + + const toggleSidebar = () => { + setSidebarCollapsed(!sidebarCollapsed); + }; + + const toggleMobileMenu = () => { + setMobileMenuOpen(!mobileMenuOpen); + }; + + return ( +

+ {/* Desktop Sidebar */} +
+ +
+ + {/* Mobile Sidebar Overlay */} + {mobileMenuOpen && ( +
+
+
+ +
+
+ )} + + {/* Main Content */} +
+ {/* Top Header */} +
+
+
+ {/* Mobile Menu Button */} + + + {/* Page Title Area - Can be expanded later if needed */} +
+ ClaimGuard Hospital Management +
+
+ +
+ {/* Notifications */} + + + {/* Quick Stats */} +
+
+

24

+

Pasien Hari Ini

+
+
+

12

+

Klaim Aktif

+
+
+

3

+

Alert

+
+
+
+
+
+ + {/* Page Content */} +
+ +
+
+
+ ); +} diff --git a/src/components/ProtectedRoute.tsx b/src/components/ProtectedRoute.tsx new file mode 100644 index 0000000..ed905df --- /dev/null +++ b/src/components/ProtectedRoute.tsx @@ -0,0 +1,15 @@ +import { Navigate } from "react-router-dom"; + +interface ProtectedRouteProps { + children: React.ReactNode; +} + +export default function ProtectedRoute({ children }: ProtectedRouteProps) { + const isAuthenticated = localStorage.getItem("isAuthenticated") === "true"; + + if (!isAuthenticated) { + return ; + } + + return <>{children}; +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..8ab6c1e --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,308 @@ +import { useState } from "react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { + LayoutDashboard, + Users, + FileText, + LogOut, + ChevronLeft, + ChevronRight, + UserCog, + Lock, + Database, + Shield, + TrendingUp, +} from "lucide-react"; +import { clsx } from "clsx"; +import claimGuardLogo from "../assets/claim-guard.jpeg"; + +interface SidebarProps { + isCollapsed?: boolean; + onToggleCollapse?: () => void; +} + +export default function Sidebar({ + isCollapsed = false, + onToggleCollapse, +}: SidebarProps) { + const location = useLocation(); + const navigate = useNavigate(); + + const handleLogout = () => { + localStorage.removeItem("isAuthenticated"); + navigate("/login"); + }; + + const menuItems = [ + { + title: "Dashboard", + icon: LayoutDashboard, + path: "/dashboard", + color: "text-blue-600", + }, + { + title: "Cost Recommendation", + icon: TrendingUp, + path: "/cost-recommendation", + color: "text-green-600", + }, + { + title: "Integrasi Data", + icon: Database, + color: "text-purple-600", + submenu: [ + { title: "BPJS", icon: Shield, path: "/integration/bpjs" }, + { + title: "Medical Record", + icon: FileText, + path: "/integration/medical-record", + }, + ], + }, + { + title: "Pasien", + icon: Users, + color: "text-orange-600", + submenu: [ + { title: "Manajemen Pasien", icon: Users, path: "/patients" }, + { + title: "Medical Record Pasien", + icon: FileText, + path: "/medical-record", + }, + { title: "BPJS Code", icon: Shield, path: "/patients/bpjs-code" }, + ], + }, + { + title: "System Administration", + icon: UserCog, + color: "text-red-700", + submenu: [ + { + title: "Manajemen User", + icon: Users, + path: "/admin/users", + }, + { + title: "Manajemen Role", + icon: Lock, + path: "/admin/roles", + }, + ], + }, + ]; + + const [expandedMenu, setExpandedMenu] = useState(null); + + const toggleSubmenu = (title: string) => { + setExpandedMenu(expandedMenu === title ? null : title); + }; + + const isActive = (path: string) => location.pathname === path; + + return ( +
+ {/* Header */} +
+
+ {!isCollapsed ? ( + <> +
+
+ ClaimGuard Logo +
+
+

+ ClaimGuard +

+

Hospital Management

+
+
+ {onToggleCollapse && ( + + )} + + ) : ( +
+ +
+ )} +
+
+ + {/* Navigation */} + + + {/* User Profile & Logout */} +
+ {!isCollapsed ? ( +
+
+
+ A +
+
+

Dr. Admin

+

Administrator

+
+
+ + +
+ ) : ( +
+
+ A +
+ +
+ )} +
+
+ ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..114b3be --- /dev/null +++ b/src/index.css @@ -0,0 +1,44 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + * { + @apply border-gray-200; + } + + body { + @apply bg-white text-gray-900 font-sans; + font-family: "Inter", system-ui, -apple-system, sans-serif; + } +} + +@layer components { + .card { + @apply rounded-lg border border-gray-200 bg-white text-gray-900 shadow-sm; + } + + .btn { + @apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-white; + } + + .btn-primary { + @apply btn bg-green-600 text-white hover:bg-green-700 h-10 px-4 py-2; + } + + .btn-secondary { + @apply btn bg-gray-100 text-gray-900 hover:bg-gray-200 h-10 px-4 py-2; + } + + .input { + @apply flex h-10 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50; + } + + .label { + @apply text-sm font-medium leading-none text-gray-700; + } +} + + diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..10ed13e --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/pages/BPJSCode.tsx b/src/pages/BPJSCode.tsx new file mode 100644 index 0000000..0496152 --- /dev/null +++ b/src/pages/BPJSCode.tsx @@ -0,0 +1,675 @@ +import { useState } from "react"; +import { + FileText, + Search, + Filter, + Download, + Eye, + Calendar, + Code, + Activity, + DollarSign, + TrendingUp, + AlertCircle, + Building2, +} from "lucide-react"; + +interface DiagnoseCode { + id: string; + icdCode: string; + description: string; + category: string; + severity: "ringan" | "sedang" | "berat"; + bpjsRate: number; + usageCount: number; + lastUsed: string; + department: string; +} + +interface ProcedureCode { + id: string; + icp9Code: string; + description: string; + category: string; + complexity: "sederhana" | "kompleks" | "sangat_kompleks"; + bpjsRate: number; + duration: number; // in minutes + usageCount: number; + lastUsed: string; + department: string; +} + +interface CodeUsageStats { + totalDiagnoses: number; + totalProcedures: number; + totalRevenue: number; + mostUsedDiagnose: string; + mostUsedProcedure: string; + averageClaimValue: number; +} + +export default function BPJSCode() { + const [activeTab, setActiveTab] = useState<"diagnose" | "procedure">( + "diagnose" + ); + const [searchTerm, setSearchTerm] = useState(""); + const [categoryFilter, setCategoryFilter] = useState("all"); + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + const formatCurrency = (amount: number) => { + return new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + minimumFractionDigits: 0, + }).format(amount); + }; + + const getSeverityColor = (severity: string) => { + switch (severity) { + case "ringan": + return "bg-green-100 text-green-800"; + case "sedang": + return "bg-yellow-100 text-yellow-800"; + case "berat": + return "bg-red-100 text-red-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + const getComplexityColor = (complexity: string) => { + switch (complexity) { + case "sederhana": + return "bg-green-100 text-green-800"; + case "kompleks": + return "bg-yellow-100 text-yellow-800"; + case "sangat_kompleks": + return "bg-red-100 text-red-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + // Sample diagnose codes data + const [diagnoseCodes] = useState([ + { + id: "1", + icdCode: "I10", + description: "Hipertensi Esensial", + category: "Penyakit Kardiovaskular", + severity: "sedang", + bpjsRate: 850000, + usageCount: 145, + lastUsed: "2024-01-15T14:30:00Z", + department: "Poli Dalam", + }, + { + id: "2", + icdCode: "E11", + description: "Diabetes Mellitus Tipe 2", + category: "Penyakit Endokrin", + severity: "sedang", + bpjsRate: 1200000, + usageCount: 98, + lastUsed: "2024-01-15T10:45:00Z", + department: "Poli Endokrin", + }, + { + id: "3", + icdCode: "J18.9", + description: "Pneumonia", + category: "Penyakit Pernafasan", + severity: "berat", + bpjsRate: 2500000, + usageCount: 67, + lastUsed: "2024-01-14T16:20:00Z", + department: "Poli Paru", + }, + { + id: "4", + icdCode: "K29.1", + description: "Gastritis Akut", + category: "Penyakit Pencernaan", + severity: "ringan", + bpjsRate: 650000, + usageCount: 112, + lastUsed: "2024-01-13T09:15:00Z", + department: "Poli Dalam", + }, + { + id: "5", + icdCode: "S52.5", + description: "Fraktur Radius", + category: "Cedera dan Keracunan", + severity: "berat", + bpjsRate: 3200000, + usageCount: 34, + lastUsed: "2024-01-12T11:30:00Z", + department: "Ortopedi", + }, + ]); + + // Sample procedure codes data + const [procedureCodes] = useState([ + { + id: "1", + icp9Code: "99.04", + description: "Transfusi Darah", + category: "Prosedur Hematologi", + complexity: "sederhana", + bpjsRate: 450000, + duration: 120, + usageCount: 89, + lastUsed: "2024-01-15T13:20:00Z", + department: "IGD", + }, + { + id: "2", + icp9Code: "36.10", + description: "Kateterisasi Jantung", + category: "Prosedur Kardiovaskular", + complexity: "sangat_kompleks", + bpjsRate: 8500000, + duration: 180, + usageCount: 23, + lastUsed: "2024-01-14T08:45:00Z", + department: "Kardiologi", + }, + { + id: "3", + icp9Code: "79.35", + description: "Open Reduction Fraktur", + category: "Prosedur Ortopedi", + complexity: "kompleks", + bpjsRate: 5200000, + duration: 240, + usageCount: 45, + lastUsed: "2024-01-13T14:15:00Z", + department: "Ortopedi", + }, + { + id: "4", + icp9Code: "45.13", + description: "Endoskopi Lambung", + category: "Prosedur Pencernaan", + complexity: "kompleks", + bpjsRate: 1800000, + duration: 45, + usageCount: 67, + lastUsed: "2024-01-12T10:30:00Z", + department: "Gastroenterologi", + }, + { + id: "5", + icp9Code: "87.44", + description: "CT Scan Thorax", + category: "Prosedur Radiologi", + complexity: "sederhana", + bpjsRate: 750000, + duration: 30, + usageCount: 156, + lastUsed: "2024-01-15T16:45:00Z", + department: "Radiologi", + }, + ]); + + // Calculate statistics + const stats: CodeUsageStats = { + totalDiagnoses: diagnoseCodes.length, + totalProcedures: procedureCodes.length, + totalRevenue: + diagnoseCodes.reduce((sum, d) => sum + d.bpjsRate * d.usageCount, 0) + + procedureCodes.reduce((sum, p) => sum + p.bpjsRate * p.usageCount, 0), + mostUsedDiagnose: + diagnoseCodes.sort((a, b) => b.usageCount - a.usageCount)[0]?.icdCode || + "", + mostUsedProcedure: + procedureCodes.sort((a, b) => b.usageCount - a.usageCount)[0]?.icp9Code || + "", + averageClaimValue: + (diagnoseCodes.reduce((sum, d) => sum + d.bpjsRate, 0) + + procedureCodes.reduce((sum, p) => sum + p.bpjsRate, 0)) / + (diagnoseCodes.length + procedureCodes.length), + }; + + // Filter data based on search and category + const filteredDiagnoseCodes = diagnoseCodes.filter((code) => { + const matchesSearch = + code.icdCode.toLowerCase().includes(searchTerm.toLowerCase()) || + code.description.toLowerCase().includes(searchTerm.toLowerCase()) || + code.category.toLowerCase().includes(searchTerm.toLowerCase()); + + const matchesCategory = + categoryFilter === "all" || code.category === categoryFilter; + + return matchesSearch && matchesCategory; + }); + + const filteredProcedureCodes = procedureCodes.filter((code) => { + const matchesSearch = + code.icp9Code.toLowerCase().includes(searchTerm.toLowerCase()) || + code.description.toLowerCase().includes(searchTerm.toLowerCase()) || + code.category.toLowerCase().includes(searchTerm.toLowerCase()); + + const matchesCategory = + categoryFilter === "all" || code.category === categoryFilter; + + return matchesSearch && matchesCategory; + }); + + return ( +
+
+ {/* Header */} +
+
+
+

+ + BPJS Code - Diagnosis & Procedure +

+

+ Kelola kode diagnosis ICD-10 dan prosedur ICP-9 untuk klaim BPJS +

+
+
+ + +
+
+
+ + {/* Statistics Cards */} +
+
+
+
+

+ Total Diagnosis +

+

+ {stats.totalDiagnoses} +

+
+
+ +
+
+
+ +
+
+
+

+ Total Prosedur +

+

+ {stats.totalProcedures} +

+
+
+ +
+
+
+ +
+
+
+

+ Total Revenue +

+

+ {formatCurrency(stats.totalRevenue)} +

+
+
+ +
+
+
+ +
+
+
+

+ Rata-rata Klaim +

+

+ {formatCurrency(stats.averageClaimValue)} +

+
+
+ +
+
+
+
+ + {/* Tabs */} +
+
+ +
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-purple-500 focus:border-transparent w-80" + /> +
+
+ + +
+
+
+
+ + {/* Tables */} +
+ {activeTab === "diagnose" ? ( + + + + + + + + + + + + + + + {filteredDiagnoseCodes.map((code) => ( + + + + + + + + + + + ))} + +
+ Kode ICD-10 + + Deskripsi & Kategori + + Departemen + + Tingkat Keparahan + + Tarif BPJS + + Usage + + Terakhir Digunakan + + Aksi +
+
+ {code.icdCode} +
+
+
+
+ {code.description} +
+
+ {code.category} +
+
+
+
+ + {code.department} +
+
+ + {code.severity.charAt(0).toUpperCase() + + code.severity.slice(1)} + + + {formatCurrency(code.bpjsRate)} + + {code.usageCount}x + +
+ + {formatDate(code.lastUsed)} +
+
+
+ + +
+
+ ) : ( + + + + + + + + + + + + + + + + {filteredProcedureCodes.map((code) => ( + + + + + + + + + + + + ))} + +
+ Kode ICP-9 + + Deskripsi & Kategori + + Departemen + + Kompleksitas + + Tarif BPJS + + Durasi + + Usage + + Terakhir Digunakan + + Aksi +
+
+ {code.icp9Code} +
+
+
+
+ {code.description} +
+
+ {code.category} +
+
+
+
+ + {code.department} +
+
+ + {code.complexity + .replace("_", " ") + .charAt(0) + .toUpperCase() + + code.complexity.replace("_", " ").slice(1)} + + + {formatCurrency(code.bpjsRate)} + + {code.duration} menit + + {code.usageCount}x + +
+ + {formatDate(code.lastUsed)} +
+
+
+ + +
+
+ )} +
+
+ + {/* Empty State */} + {((activeTab === "diagnose" && filteredDiagnoseCodes.length === 0) || + (activeTab === "procedure" && + filteredProcedureCodes.length === 0)) && ( +
+ +

+ Tidak ada kode ditemukan +

+

+ Tidak ada kode yang sesuai dengan kriteria pencarian. +

+
+ )} +
+
+ ); +} diff --git a/src/pages/BPJSSync.tsx b/src/pages/BPJSSync.tsx new file mode 100644 index 0000000..ace86de --- /dev/null +++ b/src/pages/BPJSSync.tsx @@ -0,0 +1,461 @@ +import { useState } from "react"; +import { + Shield, + Calendar, + Search, + Filter, + AlertCircle, + CheckCircle, + Clock, + RefreshCw, + Upload, + Database, + Building2, +} from "lucide-react"; + +interface BPJSSyncLog { + id: string; + timestamp: string; + type: "import" | "sync"; + status: "success" | "failed" | "in_progress"; + claimsProcessed: number; + claimsSuccess: number; + claimsFailed: number; + source: string; + duration: number; + errorMessage?: string; +} + +interface BPJSSyncStats { + totalSyncs: number; + successfulSyncs: number; + failedSyncs: number; + lastSyncTime: string; + totalClaimsProcessed: number; + averageDuration: number; +} + +export default function BPJSSync() { + const [searchTerm, setSearchTerm] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + const [isImporting, setIsImporting] = useState(false); + const [isSyncing, setIsSyncing] = useState(false); + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + // Sample BPJS sync logs data + const [syncLogs] = useState([ + { + id: "1", + timestamp: "2024-01-15T14:30:00Z", + type: "sync", + status: "success", + claimsProcessed: 234, + claimsSuccess: 230, + claimsFailed: 4, + source: "BPJS Kesehatan API", + duration: 32, + }, + { + id: "2", + timestamp: "2024-01-15T10:15:00Z", + type: "import", + status: "success", + claimsProcessed: 89, + claimsSuccess: 89, + claimsFailed: 0, + source: "Hospital Billing System", + duration: 15, + }, + { + id: "3", + timestamp: "2024-01-14T16:45:00Z", + type: "sync", + status: "failed", + claimsProcessed: 0, + claimsSuccess: 0, + claimsFailed: 0, + source: "BPJS Kesehatan API", + duration: 0, + errorMessage: "API rate limit exceeded", + }, + { + id: "4", + timestamp: "2024-01-14T09:30:00Z", + type: "import", + status: "success", + claimsProcessed: 156, + claimsSuccess: 150, + claimsFailed: 6, + source: "External Claims System", + duration: 28, + }, + { + id: "5", + timestamp: "2024-01-13T13:20:00Z", + type: "sync", + status: "in_progress", + claimsProcessed: 45, + claimsSuccess: 45, + claimsFailed: 0, + source: "BPJS Kesehatan API", + duration: 0, + }, + ]); + + // Calculate statistics + const stats: BPJSSyncStats = { + totalSyncs: syncLogs.length, + successfulSyncs: syncLogs.filter((log) => log.status === "success").length, + failedSyncs: syncLogs.filter((log) => log.status === "failed").length, + lastSyncTime: syncLogs[0]?.timestamp || "", + totalClaimsProcessed: syncLogs.reduce( + (sum, log) => sum + log.claimsProcessed, + 0 + ), + averageDuration: + syncLogs + .filter((log) => log.duration > 0) + .reduce((sum, log) => sum + log.duration, 0) / + syncLogs.filter((log) => log.duration > 0).length || 0, + }; + + // Filter sync logs based on search and status + const filteredLogs = syncLogs.filter((log) => { + const matchesSearch = + log.source.toLowerCase().includes(searchTerm.toLowerCase()) || + log.type.toLowerCase().includes(searchTerm.toLowerCase()) || + (log.errorMessage && + log.errorMessage.toLowerCase().includes(searchTerm.toLowerCase())); + + const matchesStatus = statusFilter === "all" || log.status === statusFilter; + + return matchesSearch && matchesStatus; + }); + + const handleImport = async () => { + setIsImporting(true); + // Simulate import process + setTimeout(() => { + setIsImporting(false); + // Add new log entry here + }, 3000); + }; + + const handleSync = async () => { + setIsSyncing(true); + // Simulate sync process + setTimeout(() => { + setIsSyncing(false); + // Add new log entry here + }, 5000); + }; + + return ( +
+
+ {/* Header */} +
+
+
+

+ + BPJS Sync +

+

+ Sinkronisasi dan integrasi data klaim BPJS dari sistem eksternal +

+
+
+ + +
+
+
+ + {/* Statistics Cards */} +
+
+
+
+

Total Sync

+

+ {stats.totalSyncs} +

+
+
+ +
+
+
+ +
+
+
+

Berhasil

+

+ {stats.successfulSyncs} +

+
+
+ +
+
+
+ +
+
+
+

+ Total Claims +

+

+ {stats.totalClaimsProcessed.toLocaleString()} +

+
+
+ +
+
+
+ +
+
+
+

+ Avg Duration +

+

+ {Math.round(stats.averageDuration)}s +

+
+
+ +
+
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent w-80" + /> +
+
+ + +
+
+
+
+ + {/* Sync Logs Table */} +
+
+

+ Log Sinkronisasi BPJS +

+
+
+ + + + + + + + + + + + + {filteredLogs.map((log) => ( + + + + + + + + + ))} + +
+ Waktu & Type + + Source System + + Status + + Claims Processed + + Success Rate + + Duration +
+
+
+ + {formatDate(log.timestamp)} +
+
+ + {log.type === "import" ? "Import" : "Sync"} + +
+
+
+
+ +
+
+ {log.source} +
+ {log.errorMessage && ( +
+ {log.errorMessage} +
+ )} +
+
+
+
+ + {log.status === "success" ? ( + + ) : log.status === "failed" ? ( + + ) : ( + + )} + {log.status === "success" + ? "Berhasil" + : log.status === "failed" + ? "Gagal" + : "Berlangsung"} + +
+
+
+ {log.claimsProcessed.toLocaleString()} +
+
+ {log.claimsSuccess > 0 && ( + + ✓ {log.claimsSuccess} + + )} + {log.claimsFailed > 0 && ( + + ✗ {log.claimsFailed} + + )} +
+
+
+ {log.claimsProcessed > 0 + ? Math.round( + (log.claimsSuccess / log.claimsProcessed) * 100 + ) + : 0} + % +
+
+
0 + ? `${ + (log.claimsSuccess / log.claimsProcessed) * + 100 + }%` + : "0%", + }} + >
+
+
+ {log.duration > 0 ? `${log.duration}s` : "-"} +
+
+
+ + {/* Empty State */} + {filteredLogs.length === 0 && ( +
+ +

+ Tidak ada log sinkronisasi ditemukan +

+

+ Tidak ada log yang sesuai dengan kriteria pencarian. +

+
+ )} +
+
+ ); +} diff --git a/src/pages/CostRecommendation.tsx b/src/pages/CostRecommendation.tsx new file mode 100644 index 0000000..dd3645d --- /dev/null +++ b/src/pages/CostRecommendation.tsx @@ -0,0 +1,681 @@ +import { useState } from "react"; +import { + TrendingUp, + DollarSign, + Calendar, + Search, + Filter, + Eye, + Download, + AlertCircle, + User, + FileText, + Calculator, + Target, + Code, + Stethoscope, +} from "lucide-react"; + +interface CostRecommendation { + id: string; + patientId: string; + patientName: string; + age: number; + gender: string; + diagnosis: string; + icdCode: string; + procedureCode?: string; + medicalRecordNumber: string; + admissionDate: string; + dischargeDate?: string; + roomType: string; + currentTreatment: string; + estimatedCost: number; + recommendedTreatment: string; + recommendedCost: number; + potentialSavings: number; + riskLevel: "low" | "medium" | "high"; + confidence: number; + department: string; + doctor: string; + createdDate: string; + status: "pending" | "approved" | "rejected" | "implemented"; + medicalHistory?: string; + allergies?: string; + currentMedications?: string; + vitalSigns?: { + bloodPressure: string; + heartRate: number; + temperature: number; + oxygenSaturation: number; + }; + labResults?: string; + notes?: string; +} + +interface CostStats { + totalRecommendations: number; + potentialSavings: number; + implementedSavings: number; + avgSavingsPerCase: number; + approvalRate: number; +} + +export default function CostRecommendation() { + const [searchTerm, setSearchTerm] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + const [riskFilter, setRiskFilter] = useState("all"); + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + const formatCurrency = (amount: number) => { + return new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + minimumFractionDigits: 0, + }).format(amount); + }; + + const getRiskColor = (risk: string) => { + switch (risk) { + case "low": + return "bg-green-100 text-green-800"; + case "medium": + return "bg-yellow-100 text-yellow-800"; + case "high": + return "bg-red-100 text-red-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + const getStatusColor = (status: string) => { + switch (status) { + case "approved": + return "bg-green-100 text-green-800"; + case "pending": + return "bg-yellow-100 text-yellow-800"; + case "rejected": + return "bg-red-100 text-red-800"; + case "implemented": + return "bg-blue-100 text-blue-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + const getStatusText = (status: string) => { + switch (status) { + case "approved": + return "Disetujui"; + case "pending": + return "Menunggu"; + case "rejected": + return "Ditolak"; + case "implemented": + return "Diterapkan"; + default: + return status; + } + }; + + const getRiskText = (risk: string) => { + switch (risk) { + case "low": + return "Rendah"; + case "medium": + return "Sedang"; + case "high": + return "Tinggi"; + default: + return risk; + } + }; + + // Sample cost recommendations data + const [recommendations] = useState([ + { + id: "1", + patientId: "P001", + patientName: "Ahmad Santoso", + age: 45, + gender: "Laki-laki", + diagnosis: "Hipertensi Esensial", + icdCode: "I10", + procedureCode: "99213", + medicalRecordNumber: "MR2024001", + admissionDate: "2024-01-10T08:00:00Z", + dischargeDate: "2024-01-11T16:00:00Z", + roomType: "Ruang Rawat Jalan", + currentTreatment: "Amlodipine 10mg + Monitoring Harian", + estimatedCost: 2500000, + recommendedTreatment: "Amlodipine 5mg + Monitoring Mingguan", + recommendedCost: 1800000, + potentialSavings: 700000, + riskLevel: "low", + confidence: 92, + department: "Poli Dalam", + doctor: "Dr. Sarah Wijaya", + createdDate: "2024-01-15T14:30:00Z", + status: "pending", + medicalHistory: "Riwayat hipertensi keluarga, tidak ada riwayat stroke", + allergies: "Tidak ada alergi obat yang diketahui", + currentMedications: "Amlodipine 10mg 1x1, Aspirin 80mg 1x1", + vitalSigns: { + bloodPressure: "140/90", + heartRate: 78, + temperature: 36.5, + oxygenSaturation: 98, + }, + labResults: "Kolesterol Total: 220 mg/dl, HDL: 45 mg/dl, LDL: 140 mg/dl", + notes: "Pasien menunjukkan respons baik dengan dosis rendah", + }, + { + id: "2", + patientId: "P002", + patientName: "Siti Nurhaliza", + age: 52, + gender: "Perempuan", + diagnosis: "Diabetes Mellitus Tipe 2", + icdCode: "E11", + procedureCode: "99214", + medicalRecordNumber: "MR2024002", + admissionDate: "2024-01-12T09:30:00Z", + dischargeDate: "2024-01-14T14:00:00Z", + roomType: "Ruang Rawat Inap Kelas II", + currentTreatment: "Insulin + Metformin + Konsultasi Harian", + estimatedCost: 4200000, + recommendedTreatment: "Metformin + Diet Program + Konsultasi Mingguan", + recommendedCost: 2800000, + potentialSavings: 1400000, + riskLevel: "medium", + confidence: 87, + department: "Poli Endokrin", + doctor: "Dr. Rahman Hidayat", + createdDate: "2024-01-15T10:15:00Z", + status: "approved", + medicalHistory: "DM Tipe 2 sejak 5 tahun, riwayat hipertensi", + allergies: "Alergi sulfa", + currentMedications: "Insulin Lantus 20 unit, Metformin 500mg 2x1", + vitalSigns: { + bloodPressure: "130/85", + heartRate: 82, + temperature: 36.8, + oxygenSaturation: 96, + }, + labResults: "HbA1c: 8.2%, Glukosa Puasa: 180 mg/dl, Kreatinin: 1.1 mg/dl", + notes: "Pasien cocok dengan program diet terstruktur", + }, + { + id: "3", + patientId: "P003", + patientName: "Budi Prasetyo", + age: 38, + gender: "Laki-laki", + diagnosis: "Pneumonia", + icdCode: "J18.9", + procedureCode: "99223", + medicalRecordNumber: "MR2024003", + admissionDate: "2024-01-11T15:00:00Z", + dischargeDate: "2024-01-13T10:30:00Z", + roomType: "Ruang Rawat Inap Kelas I", + currentTreatment: "Antibiotik IV + Rawat Inap 7 hari", + estimatedCost: 8500000, + recommendedTreatment: "Antibiotik Oral + Rawat Jalan", + recommendedCost: 3200000, + potentialSavings: 5300000, + riskLevel: "high", + confidence: 78, + department: "Poli Paru", + doctor: "Dr. Linda Sari", + createdDate: "2024-01-14T16:45:00Z", + status: "implemented", + medicalHistory: "Riwayat merokok 15 tahun, berhenti 2 tahun lalu", + allergies: "Alergi penisilin", + currentMedications: "Ceftriaxone 2g IV, Azithromycin 500mg", + vitalSigns: { + bloodPressure: "120/80", + heartRate: 92, + temperature: 38.2, + oxygenSaturation: 94, + }, + labResults: "Leukosit: 12,000/μL, CRP: 15 mg/L, Procalcitonin: 0.8 ng/mL", + notes: "Monitoring ketat diperlukan untuk rawat jalan", + }, + { + id: "4", + patientId: "P004", + patientName: "Maria Lopez", + age: 29, + gender: "Perempuan", + diagnosis: "Gastritis Akut", + icdCode: "K29.1", + procedureCode: "99212", + medicalRecordNumber: "MR2024004", + admissionDate: "2024-01-13T08:15:00Z", + roomType: "Ruang Rawat Jalan", + currentTreatment: "PPI + Antasida + Konsultasi Harian", + estimatedCost: 1500000, + recommendedTreatment: "H2 Blocker + Diet + Konsultasi Mingguan", + recommendedCost: 800000, + potentialSavings: 700000, + riskLevel: "low", + confidence: 94, + department: "Poli Dalam", + doctor: "Dr. Sarah Wijaya", + createdDate: "2024-01-13T11:20:00Z", + status: "rejected", + medicalHistory: "Tidak ada riwayat penyakit kronis", + allergies: "Alergi H2 blocker (ranitidin)", + currentMedications: "Omeprazole 20mg 1x1, Antasida 3x1", + vitalSigns: { + bloodPressure: "110/70", + heartRate: 75, + temperature: 36.4, + oxygenSaturation: 99, + }, + labResults: "Hemoglobin: 12.5 g/dl, H. pylori: Negatif", + notes: "Pasien memiliki riwayat alergi terhadap H2 blocker", + }, + { + id: "5", + patientId: "P005", + patientName: "Andi Kusuma", + age: 67, + gender: "Laki-laki", + diagnosis: "Osteoarthritis", + icdCode: "M15.9", + procedureCode: "99215", + medicalRecordNumber: "MR2024005", + admissionDate: "2024-01-12T07:45:00Z", + roomType: "Ruang Rawat Jalan", + currentTreatment: "NSAID + Fisioterapi Intensif", + estimatedCost: 3200000, + recommendedTreatment: "Paracetamol + Fisioterapi Standar + Olahraga", + recommendedCost: 1900000, + potentialSavings: 1300000, + riskLevel: "low", + confidence: 89, + department: "Ortopedi", + doctor: "Dr. Kevin Tan", + createdDate: "2024-01-12T09:30:00Z", + status: "approved", + medicalHistory: "Osteoarthritis bilateral knee sejak 10 tahun", + allergies: "Tidak ada alergi obat yang diketahui", + currentMedications: "Diclofenac 50mg 2x1, Glucosamine 500mg 2x1", + vitalSigns: { + bloodPressure: "135/85", + heartRate: 68, + temperature: 36.3, + oxygenSaturation: 97, + }, + labResults: "Fungsi ginjal normal, tidak ada tanda inflamasi sistemik", + notes: "Pasien menunjukkan respons baik dengan terapi konservatif", + }, + ]); + + // Calculate statistics + const stats: CostStats = { + totalRecommendations: recommendations.length, + potentialSavings: recommendations.reduce( + (sum, r) => sum + r.potentialSavings, + 0 + ), + implementedSavings: recommendations + .filter((r) => r.status === "implemented") + .reduce((sum, r) => sum + r.potentialSavings, 0), + avgSavingsPerCase: + recommendations.reduce((sum, r) => sum + r.potentialSavings, 0) / + recommendations.length, + approvalRate: + (recommendations.filter( + (r) => r.status === "approved" || r.status === "implemented" + ).length / + recommendations.length) * + 100, + }; + + // Filter recommendations + const filteredRecommendations = recommendations.filter((rec) => { + const matchesSearch = + rec.patientName.toLowerCase().includes(searchTerm.toLowerCase()) || + rec.diagnosis.toLowerCase().includes(searchTerm.toLowerCase()) || + rec.icdCode.toLowerCase().includes(searchTerm.toLowerCase()) || + rec.doctor.toLowerCase().includes(searchTerm.toLowerCase()); + + const matchesStatus = statusFilter === "all" || rec.status === statusFilter; + const matchesRisk = riskFilter === "all" || rec.riskLevel === riskFilter; + + return matchesSearch && matchesStatus && matchesRisk; + }); + + return ( +
+
+ {/* Header */} +
+
+
+

+ + Cost Recommendation +

+

+ Rekomendasi optimalisasi biaya perawatan berdasarkan analisis + medis +

+
+
+ + +
+
+
+ + {/* Statistics Cards */} +
+
+
+
+

+ Total Rekomendasi +

+

+ {stats.totalRecommendations} +

+
+
+ +
+
+
+ +
+
+
+

+ Potensi Penghematan +

+

+ {formatCurrency(stats.potentialSavings)} +

+
+
+ +
+
+
+ +
+
+
+

+ Penghematan Terealisasi +

+

+ {formatCurrency(stats.implementedSavings)} +

+
+
+ +
+
+
+ +
+
+
+

+ Tingkat Persetujuan +

+

+ {Math.round(stats.approvalRate)}% +

+
+
+ +
+
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-green-500 focus:border-transparent w-80" + /> +
+
+ + + +
+
+
+
+ + {/* Recommendations Table */} +
+
+

+ Rekomendasi Optimalisasi Biaya +

+
+
+ + + + + + + + + + + + + + + {filteredRecommendations.map((rec) => ( + + + + + + + + + + + ))} + +
+ Pasien & Medical Record + + Medical Code + + Treatment Saat Ini + + Rekomendasi + + Potensi Penghematan + + Status & Risiko + + Tanggal + + Aksi +
+
+
+
+ +
+
+
+
+ {rec.patientName} +
+
+ {rec.diagnosis} +
+
+ + MR: {rec.medicalRecordNumber} +
+
+ {rec.age} th, {rec.gender} | {rec.roomType} +
+
+
+
+
+
+ + ICD: {rec.icdCode} +
+ {rec.procedureCode && ( +
+ + CPT: {rec.procedureCode} +
+ )} +
+ Dept: {rec.department} +
+
+
+
+ {rec.currentTreatment} +
+
+ Estimasi: {formatCurrency(rec.estimatedCost)} +
+
+
+ {rec.recommendedTreatment} +
+
+ Biaya: {formatCurrency(rec.recommendedCost)} +
+
+
+ {formatCurrency(rec.potentialSavings)} +
+
+ {Math.round( + (rec.potentialSavings / rec.estimatedCost) * 100 + )} + % penghematan +
+
+
+ + {getStatusText(rec.status)} + +
+ + {getRiskText(rec.riskLevel)} + +
+ {rec.confidence}% +
+
+
+
+
+
+ + {formatDate(rec.createdDate)} +
+
+ Admission: {formatDate(rec.admissionDate)} +
+ {rec.dischargeDate && ( +
+ Discharge: {formatDate(rec.dischargeDate)} +
+ )} +
+ Dr. {rec.doctor.replace("Dr. ", "")} +
+
+
+
+ + +
+
+
+
+ + {/* Empty State */} + {filteredRecommendations.length === 0 && ( +
+ +

+ Tidak ada rekomendasi ditemukan +

+

+ Tidak ada rekomendasi yang sesuai dengan kriteria pencarian. +

+
+ )} +
+
+ ); +} diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx new file mode 100644 index 0000000..b2b99b8 --- /dev/null +++ b/src/pages/Dashboard.tsx @@ -0,0 +1,339 @@ +import { Users, TrendingUp, AlertTriangle, Shield } from "lucide-react"; + +export default function Dashboard() { + const stats = [ + { + title: "Pasien Datang", + value: "89", + change: "+12%", + changeColor: "text-green-600", + icon: Users, + color: "text-blue-600", + subtitle: "Hari ini", + }, + { + title: "Potential Overclaim", + value: "7", + change: "+2", + changeColor: "text-red-600", + icon: AlertTriangle, + color: "text-red-600", + subtitle: "Perlu review", + }, + { + title: "Rata-rata Biaya", + value: "Rp 2.8M", + change: "+5.2%", + changeColor: "text-orange-600", + icon: TrendingUp, + color: "text-orange-600", + subtitle: "Per klaim", + }, + { + title: "Kode BPJS Aktif", + value: "156", + change: "8 kode baru", + changeColor: "text-green-600", + icon: Shield, + color: "text-purple-600", + subtitle: "Total kode", + }, + ]; + + return ( +
+
+ {/* Welcome Section */} +
+

+ Selamat Datang di Dashboard +

+

+ Kelola sistem rumah sakit dengan efisien dan pantau semua aktivitas + secara real-time. +

+
+ + {/* Stats Grid */} +
+ {stats.map((stat, index) => ( +
+
+
+ +
+ + {stat.change} + +
+
+

+ {stat.value} +

+

+ {stat.title} +

+

{stat.subtitle}

+
+
+ ))} +
+ + {/* Main Grid */} +
+ {/* Tren Biaya Kode Medis */} +
+
+

+ Tren Biaya Kode Medis +

+ +
+ +
+ {[ + { + code: "A15.0", + name: "Tuberculosis Paru", + cost: "Rp 3.2M", + change: "+15%", + trend: "up", + count: "12 kasus", + }, + { + code: "I21.9", + name: "Acute Myocardial Infarction", + cost: "Rp 8.5M", + change: "+3%", + trend: "up", + count: "4 kasus", + }, + { + code: "N18.6", + name: "Chronic Kidney Disease", + cost: "Rp 5.1M", + change: "-8%", + trend: "down", + count: "7 kasus", + }, + { + code: "O80.0", + name: "Spontaneous Delivery", + cost: "Rp 2.8M", + change: "+5%", + trend: "up", + count: "23 kasus", + }, + ].map((item, index) => ( +
+
+
+ + {item.code} + + + {item.change} + +
+

+ {item.name} +

+

+ {item.count} • {item.cost} +

+
+
+ +
+
+ ))} +
+
+ + {/* Distribusi Kode BPJS */} +
+
+

+ Distribusi Kode BPJS +

+ +
+ +
+ {[ + { + category: "Rawat Inap", + codes: "89 kode", + percentage: "57%", + color: "bg-blue-500", + count: "234 klaim", + }, + { + category: "Rawat Jalan", + codes: "45 kode", + percentage: "29%", + color: "bg-green-500", + count: "156 klaim", + }, + { + category: "IGD", + codes: "22 kode", + percentage: "14%", + color: "bg-red-500", + count: "67 klaim", + }, + ].map((item, index) => ( +
+
+
+
+ + {item.category} + +
+ + {item.percentage} + +
+
+
+
+
+ {item.codes} + {item.count} +
+
+ ))} +
+ +
+
+ Total Kode Aktif: + 156 kode +
+
+ Total Klaim Bulan Ini: + 457 klaim +
+
+
+
+ + {/* Additional Analytics Row */} +
+
+

+ Pasien Datang Hari Ini +

+
+
+ Rawat Jalan + 52 +
+
+ Rawat Inap + 23 +
+
+ IGD + 14 +
+
+
+ + Total + + 89 +
+
+
+
+ +
+

+ Potential Overclaim +

+
+
+ High Risk + 3 +
+
+ Medium Risk + 4 +
+
+ Low Risk + 8 +
+
+
+ + Perlu Review + + 7 +
+
+
+
+ +
+

+ Verifikasi Klaim +

+
+
+ Disetujui + 89 +
+
+ Pending + 23 +
+
+ Ditolak + 5 +
+
+
+ + Total Klaim + + 117 +
+
+
+
+
+
+
+ ); +} diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx new file mode 100644 index 0000000..9441613 --- /dev/null +++ b/src/pages/Login.tsx @@ -0,0 +1,318 @@ +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { useForm } from "react-hook-form"; +import { + Heart, + Shield, + Eye, + EyeOff, + Lock, + User, + Activity, + Stethoscope, + AlertCircle, +} from "lucide-react"; +import { clsx } from "clsx"; + +interface LoginForm { + username: string; + password: string; + remember: boolean; +} + +export default function Login() { + const [showPassword, setShowPassword] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const navigate = useNavigate(); + + const { + register, + handleSubmit, + formState: { errors }, + setError, + } = useForm({ + defaultValues: { + username: "", + password: "", + remember: false, + }, + }); + + const onSubmit = async (data: LoginForm) => { + setIsLoading(true); + + try { + // Simulate API call + await new Promise((resolve) => setTimeout(resolve, 1500)); + + // Simple authentication check (replace with real API) + if (data.username === "admin" && data.password === "admin123") { + localStorage.setItem("isAuthenticated", "true"); + navigate("/dashboard"); + } else { + setError("root", { + message: "Username atau password tidak valid", + }); + } + } catch { + setError("root", { + message: "Terjadi kesalahan saat login. Silakan coba lagi.", + }); + } finally { + setIsLoading(false); + } + }; + + return ( +
+ {/* Left Side - Branding */} +
+
+ + {/* Background Pattern */} +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+

ClaimGuard

+

Hospital Management System

+
+
+
+ +
+

+ Sistem Manajemen +
+ Rumah Sakit Terpadu +

+ +

+ Solusi digital untuk pengelolaan administrasi, klaim asuransi, dan + operasional rumah sakit yang efisien dan aman. +

+ +
+
+ + Keamanan Data Tingkat Enterprise +
+
+ + Monitoring Real-time +
+
+ + Fokus pada Pelayanan Pasien +
+
+
+
+
+ + {/* Right Side - Login Form */} +
+
+ {/* Mobile Header */} +
+
+
+ +
+
+

ClaimGuard

+

Hospital Management

+
+
+
+ +
+
+

+ Selamat Datang +

+

+ Silakan masuk ke akun Anda untuk mengakses sistem +

+
+ +
+ {/* Username Field */} +
+ +
+ + +
+ {errors.username && ( +

+ + {errors.username.message} +

+ )} +
+ + {/* Password Field */} +
+ +
+ + + +
+ {errors.password && ( +

+ + {errors.password.message} +

+ )} +
+ + {/* Remember Me & Forgot Password */} +
+
+ + +
+ +
+ + {/* Error Message */} + {errors.root && ( +
+

+ + {errors.root.message} +

+
+ )} + + {/* Login Button */} + +
+ + {/* Demo Credentials */} +
+

+ Demo Credentials: +

+
+

+ Username:{" "} + admin +

+

+ Password:{" "} + + admin123 + +

+
+
+
+ + {/* Footer */} +
+

+ © 2024 ClaimGuard Hospital Management System. +
+ Semua hak dilindungi. +

+
+
+
+
+ ); +} diff --git a/src/pages/MedicalRecord.tsx b/src/pages/MedicalRecord.tsx new file mode 100644 index 0000000..f2487f4 --- /dev/null +++ b/src/pages/MedicalRecord.tsx @@ -0,0 +1,470 @@ +import { useState } from "react"; +import { + FileText, + Search, + Filter, + Plus, + Eye, + Edit, + Calendar, + User, + Stethoscope, + Heart, + Activity, + ClipboardList, + Download, + Printer, +} from "lucide-react"; + +interface MedicalRecord { + id: string; + patientId: string; + patientName: string; + patientAge: number; + patientGender: string; + recordDate: string; + diagnosis: string; + icdCode: string; + treatment: string; + doctor: string; + department: string; + status: "draft" | "completed" | "reviewed"; + vital: { + bloodPressure: string; + heartRate: number; + temperature: number; + weight: number; + }; +} + +const sampleMedicalRecords: MedicalRecord[] = [ + { + id: "MR001", + patientId: "P001", + patientName: "Ahmad Rizki", + patientAge: 45, + patientGender: "Laki-laki", + recordDate: "2024-01-15T10:30:00Z", + diagnosis: "Hipertensi Grade 2", + icdCode: "I10", + treatment: "Amlodipine 10mg 1x1, Diet rendah garam", + doctor: "Dr. Siti Nurhaliza", + department: "Cardiology", + status: "completed", + vital: { + bloodPressure: "160/100", + heartRate: 88, + temperature: 36.5, + weight: 75, + }, + }, + { + id: "MR002", + patientId: "P002", + patientName: "Maria Lopez", + patientAge: 32, + patientGender: "Perempuan", + recordDate: "2024-01-15T14:15:00Z", + diagnosis: "Gastritis Akut", + icdCode: "K29.0", + treatment: "Omeprazole 20mg 2x1, Antasida 3x1", + doctor: "Dr. Budi Santoso", + department: "Internal Medicine", + status: "reviewed", + vital: { + bloodPressure: "120/80", + heartRate: 76, + temperature: 37.2, + weight: 58, + }, + }, + { + id: "MR003", + patientId: "P003", + patientName: "Dewi Sartika", + patientAge: 28, + patientGender: "Perempuan", + recordDate: "2024-01-15T09:45:00Z", + diagnosis: "Kehamilan Normal G1P0A0", + icdCode: "Z34.0", + treatment: "Asam folat 1x1, Vitamin prenatal", + doctor: "Dr. Ahmad Rizki", + department: "Obstetrics & Gynecology", + status: "completed", + vital: { + bloodPressure: "110/70", + heartRate: 82, + temperature: 36.8, + weight: 62, + }, + }, + { + id: "MR004", + patientId: "P004", + patientName: "Joko Widodo", + patientAge: 56, + patientGender: "Laki-laki", + recordDate: "2024-01-15T16:20:00Z", + diagnosis: "Diabetes Mellitus Tipe 2", + icdCode: "E11.9", + treatment: "Metformin 500mg 2x1, Diet DM", + doctor: "Dr. Siti Nurhaliza", + department: "Endocrinology", + status: "draft", + vital: { + bloodPressure: "140/90", + heartRate: 92, + temperature: 36.7, + weight: 82, + }, + }, +]; + +export default function MedicalRecord() { + const [records] = useState(sampleMedicalRecords); + const [searchTerm, setSearchTerm] = useState(""); + const [selectedDepartment, setSelectedDepartment] = useState(""); + const [selectedStatus, setSelectedStatus] = useState(""); + + const departments = [ + "Cardiology", + "Internal Medicine", + "Obstetrics & Gynecology", + "Endocrinology", + "Emergency", + "Surgery", + "Pediatrics", + ]; + + const filteredRecords = records.filter((record) => { + const matchesSearch = + record.patientName.toLowerCase().includes(searchTerm.toLowerCase()) || + record.diagnosis.toLowerCase().includes(searchTerm.toLowerCase()) || + record.icdCode.toLowerCase().includes(searchTerm.toLowerCase()) || + record.doctor.toLowerCase().includes(searchTerm.toLowerCase()); + + const matchesDepartment = + !selectedDepartment || record.department === selectedDepartment; + + const matchesStatus = !selectedStatus || record.status === selectedStatus; + + return matchesSearch && matchesDepartment && matchesStatus; + }); + + const getStatusColor = (status: string) => { + switch (status) { + case "completed": + return "bg-green-100 text-green-800"; + case "reviewed": + return "bg-blue-100 text-blue-800"; + case "draft": + return "bg-yellow-100 text-yellow-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + const getStatusText = (status: string) => { + switch (status) { + case "completed": + return "Selesai"; + case "reviewed": + return "Direview"; + case "draft": + return "Draft"; + default: + return status; + } + }; + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + return ( +
+
+ {/* Header */} +
+
+
+
+ +
+
+

+ Medical Record +

+

+ Kelola rekam medis pasien dan riwayat diagnosa +

+
+
+
+ + +
+
+
+ + {/* Stats Cards */} +
+
+
+
+

+ Total Records +

+

+ {records.length} +

+
+ +
+
+
+
+
+

Completed

+

+ {records.filter((r) => r.status === "completed").length} +

+
+ +
+
+
+
+
+

Reviewed

+

+ {records.filter((r) => r.status === "reviewed").length} +

+
+ +
+
+
+
+
+

Draft

+

+ {records.filter((r) => r.status === "draft").length} +

+
+ +
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-green-500 focus:border-transparent w-80" + /> +
+
+ + + +
+
+
+
+ + {/* Medical Records Table */} +
+
+ + + + + + + + + + + + + + {filteredRecords.map((record) => ( + + + + + + + + + + ))} + +
+ Pasien + + Diagnosa & ICD + + Vital Signs + + Dokter & Dept + + Status + + Tanggal + + Aksi +
+
+
+ {record.patientName + .split(" ") + .map((n) => n[0]) + .join("") + .toUpperCase()} +
+
+
+ {record.patientName} +
+
+ + {record.patientAge} tahun • {record.patientGender} +
+
+ ID: {record.patientId} +
+
+
+
+
+
+ {record.diagnosis} +
+
+ {record.icdCode} +
+
+ {record.treatment} +
+
+
+
+
+ + {record.vital.bloodPressure} mmHg +
+
+ + {record.vital.heartRate} bpm +
+
+ + {record.vital.temperature}°C +
+
+ + {record.vital.weight} kg +
+
+
+
+ +
+
+ {record.doctor} +
+
+ {record.department} +
+
+
+
+ + {getStatusText(record.status)} + + +
+ + {formatDate(record.recordDate)} +
+
+
+ + + + +
+
+
+
+ + {/* Empty State */} + {filteredRecords.length === 0 && ( +
+ +

+ Tidak ada medical record ditemukan +

+

+ Mulai dengan menambahkan medical record baru. +

+
+ )} +
+
+ ); +} diff --git a/src/pages/MedicalRecordSync.tsx b/src/pages/MedicalRecordSync.tsx new file mode 100644 index 0000000..00b4f3d --- /dev/null +++ b/src/pages/MedicalRecordSync.tsx @@ -0,0 +1,552 @@ +import { useState } from "react"; +import { + Database, + RefreshCw, + Calendar, + Search, + Filter, + CheckCircle, + XCircle, + Clock, + AlertCircle, + FileText, + Activity, + Users, + Building2, + Upload, +} from "lucide-react"; + +interface SyncLog { + id: string; + timestamp: string; + type: "import" | "sync"; + status: "success" | "failed" | "in_progress"; + recordsProcessed: number; + recordsSuccess: number; + recordsFailed: number; + source: string; + duration: number; // in seconds + errorMessage?: string; + details: { + patientsUpdated: number; + diagnosesAdded: number; + treatmentsAdded: number; + vitalsUpdated: number; + }; +} + +interface SyncStats { + totalSyncs: number; + successfulSyncs: number; + failedSyncs: number; + lastSyncTime: string; + totalRecordsProcessed: number; + averageDuration: number; +} + +export default function MedicalRecordSync() { + const [searchTerm, setSearchTerm] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + const [isImporting, setIsImporting] = useState(false); + const [isSyncing, setIsSyncing] = useState(false); + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + const getStatusColor = (status: string) => { + switch (status) { + case "success": + return "bg-green-100 text-green-800"; + case "failed": + return "bg-red-100 text-red-800"; + case "in_progress": + return "bg-blue-100 text-blue-800"; + default: + return "bg-gray-100 text-gray-800"; + } + }; + + const getStatusIcon = (status: string) => { + switch (status) { + case "success": + return ; + case "failed": + return ; + case "in_progress": + return ; + default: + return ; + } + }; + + const getStatusText = (status: string) => { + switch (status) { + case "success": + return "Berhasil"; + case "failed": + return "Gagal"; + case "in_progress": + return "Berlangsung"; + default: + return status; + } + }; + + // Sample sync logs data + const [syncLogs] = useState([ + { + id: "1", + timestamp: "2024-01-15T14:30:00Z", + type: "sync", + status: "success", + recordsProcessed: 1250, + recordsSuccess: 1245, + recordsFailed: 5, + source: "Hospital Management System API", + duration: 45, + details: { + patientsUpdated: 89, + diagnosesAdded: 156, + treatmentsAdded: 203, + vitalsUpdated: 797, + }, + }, + { + id: "2", + timestamp: "2024-01-15T10:15:00Z", + type: "import", + status: "success", + recordsProcessed: 567, + recordsSuccess: 567, + recordsFailed: 0, + source: "External Lab System", + duration: 23, + details: { + patientsUpdated: 0, + diagnosesAdded: 234, + treatmentsAdded: 0, + vitalsUpdated: 333, + }, + }, + { + id: "3", + timestamp: "2024-01-14T16:45:00Z", + type: "sync", + status: "failed", + recordsProcessed: 0, + recordsSuccess: 0, + recordsFailed: 0, + source: "Radiology System API", + duration: 0, + errorMessage: "Connection timeout - API endpoint tidak merespons", + details: { + patientsUpdated: 0, + diagnosesAdded: 0, + treatmentsAdded: 0, + vitalsUpdated: 0, + }, + }, + { + id: "4", + timestamp: "2024-01-14T09:30:00Z", + type: "import", + status: "success", + recordsProcessed: 834, + recordsSuccess: 820, + recordsFailed: 14, + source: "Pharmacy System", + duration: 38, + details: { + patientsUpdated: 45, + diagnosesAdded: 67, + treatmentsAdded: 567, + vitalsUpdated: 155, + }, + }, + { + id: "5", + timestamp: "2024-01-13T13:20:00Z", + type: "sync", + status: "in_progress", + recordsProcessed: 423, + recordsSuccess: 423, + recordsFailed: 0, + source: "Emergency System API", + duration: 0, + details: { + patientsUpdated: 12, + diagnosesAdded: 89, + treatmentsAdded: 134, + vitalsUpdated: 188, + }, + }, + ]); + + // Calculate statistics + const stats: SyncStats = { + totalSyncs: syncLogs.length, + successfulSyncs: syncLogs.filter((log) => log.status === "success").length, + failedSyncs: syncLogs.filter((log) => log.status === "failed").length, + lastSyncTime: syncLogs[0]?.timestamp || "", + totalRecordsProcessed: syncLogs.reduce( + (sum, log) => sum + log.recordsProcessed, + 0 + ), + averageDuration: + syncLogs + .filter((log) => log.duration > 0) + .reduce((sum, log) => sum + log.duration, 0) / + syncLogs.filter((log) => log.duration > 0).length || 0, + }; + + // Filter logs based on search and status + const filteredLogs = syncLogs.filter((log) => { + const matchesSearch = + log.source.toLowerCase().includes(searchTerm.toLowerCase()) || + log.type.toLowerCase().includes(searchTerm.toLowerCase()) || + (log.errorMessage && + log.errorMessage.toLowerCase().includes(searchTerm.toLowerCase())); + + const matchesStatus = statusFilter === "all" || log.status === statusFilter; + + return matchesSearch && matchesStatus; + }); + + const handleImport = async () => { + setIsImporting(true); + // Simulate import process + setTimeout(() => { + setIsImporting(false); + // Add new log entry here + }, 3000); + }; + + const handleSync = async () => { + setIsSyncing(true); + // Simulate sync process + setTimeout(() => { + setIsSyncing(false); + // Add new log entry here + }, 5000); + }; + + return ( +
+
+ {/* Header */} +
+
+
+

+ + Medical Record Sync +

+

+ Sinkronisasi dan import data medical record dari sistem + eksternal +

+
+
+ + +
+
+
+ + {/* Statistics Cards */} +
+
+
+
+

Total Sync

+

+ {stats.totalSyncs} +

+
+
+ +
+
+
+ +
+
+
+

Berhasil

+

+ {stats.successfulSyncs} +

+
+
+ +
+
+
+ +
+
+
+

+ Total Records +

+

+ {stats.totalRecordsProcessed.toLocaleString()} +

+
+
+ +
+
+
+ +
+
+
+

+ Avg Duration +

+

+ {Math.round(stats.averageDuration)}s +

+
+
+ +
+
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-transparent w-80" + /> +
+
+ + +
+
+
+
+ + {/* Sync Logs Table */} +
+
+

+ Log Sinkronisasi Medical Record +

+
+
+ + + + + + + + + + + + + + {filteredLogs.map((log) => ( + + + + + + + + + + ))} + +
+ Waktu & Type + + Source System + + Status + + Records Processed + + Success Rate + + Duration + + Details +
+
+
+ + {formatDate(log.timestamp)} +
+
+ + {log.type === "import" ? "Import" : "Sync"} + +
+
+
+
+ +
+
+ {log.source} +
+ {log.errorMessage && ( +
+ {log.errorMessage} +
+ )} +
+
+
+
+ + {getStatusIcon(log.status)} + + {getStatusText(log.status)} + + +
+
+
+ {log.recordsProcessed.toLocaleString()} +
+
+ {log.recordsSuccess > 0 && ( + + ✓ {log.recordsSuccess} + + )} + {log.recordsFailed > 0 && ( + + ✗ {log.recordsFailed} + + )} +
+
+
+ {log.recordsProcessed > 0 + ? Math.round( + (log.recordsSuccess / log.recordsProcessed) * 100 + ) + : 0} + % +
+
+
0 + ? `${ + (log.recordsSuccess / + log.recordsProcessed) * + 100 + }%` + : "0%", + }} + >
+
+
+ {log.duration > 0 ? `${log.duration}s` : "-"} + +
+
+ + Pasien: {log.details.patientsUpdated} +
+
+ + Diagnosis: {log.details.diagnosesAdded} +
+
+ + Treatment: {log.details.treatmentsAdded} +
+
+ + Vitals: {log.details.vitalsUpdated} +
+
+
+
+
+ + {/* Empty State */} + {filteredLogs.length === 0 && ( +
+ +

+ Tidak ada log sinkronisasi ditemukan +

+

+ Tidak ada log yang sesuai dengan kriteria pencarian. +

+
+ )} +
+
+ ); +} diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..0f9531f --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,158 @@ +import { Link } from "react-router-dom"; +import { + Home, + AlertTriangle, + ArrowLeft, + Search, + Heart, + Stethoscope, + Activity, + Phone, +} from "lucide-react"; + +export default function NotFound() { + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

404

+

+ Halaman Tidak Ditemukan +

+

+ Maaf, halaman yang Anda cari tidak dapat ditemukan di sistem + ClaimGuard Hospital Management. +

+
+ + {/* Medical Icons Animation */} +
+
+
+ +
+
+ +
+
+ +
+
+
+ + {/* Possible Reasons */} +
+

+ Kemungkinan Penyebab: +

+
+
+
+ +
+
+

URL Salah

+

+ Periksa kembali alamat URL yang dimasukkan +

+
+
+ +
+
+ +
+
+

Halaman Dipindahkan

+

+ Halaman mungkin telah dipindahkan atau dihapus +

+
+
+ +
+
+ +
+
+

Akses Terbatas

+

+ Halaman mungkin memerlukan izin khusus +

+
+
+ +
+
+ +
+
+

Maintenance

+

+ Sistem sedang dalam pemeliharaan +

+
+
+
+
+ + {/* Action Buttons */} +
+ + + Kembali ke Dashboard + + + +
+ + {/* Help Section */} +
+

+ Butuh Bantuan? +

+

+ Jika Anda yakin halaman ini seharusnya ada, silakan hubungi tim IT + atau administrator sistem. +

+
+ + 📞 Hubungi Support + + + + ⚙️ Pengaturan Sistem + +
+
+ + {/* Footer */} +
+

© 2024 ClaimGuard Hospital Management System

+

Error Code: 404 - Page Not Found

+
+
+
+ ); +} diff --git a/src/pages/NotFoundProtected.tsx b/src/pages/NotFoundProtected.tsx new file mode 100644 index 0000000..3371bbb --- /dev/null +++ b/src/pages/NotFoundProtected.tsx @@ -0,0 +1,114 @@ +import { Link } from "react-router-dom"; +import { Home, AlertTriangle, ArrowLeft, Search, Settings } from "lucide-react"; + +export default function NotFoundProtected() { + return ( +
+
+
+ {/* Icon */} +
+
+ +
+
+ + {/* Error Message */} +

404

+

+ Halaman Tidak Ditemukan +

+

+ Halaman yang Anda cari tidak tersedia atau telah dipindahkan ke + lokasi lain dalam sistem ClaimGuard. +

+ + {/* Quick Info Cards */} +
+
+
+ +
+

Periksa URL

+

+ Pastikan alamat URL yang dimasukkan sudah benar +

+
+ +
+
+ +
+

Menu Sidebar

+

+ Gunakan menu sidebar untuk navigasi yang tersedia +

+
+ +
+
+ +
+

Izin Akses

+

+ Halaman mungkin memerlukan izin khusus +

+
+
+ + {/* Action Buttons */} +
+ + + Dashboard Utama + + + +
+ + {/* Available Pages */} +
+

+ Halaman yang Tersedia: +

+
+ + 📊 Dashboard + + + 👥 Data Pasien + + + ⚙️ Pengaturan + + + ❓ Bantuan + +
+
+
+
+
+ ); +} diff --git a/src/pages/Patients.tsx b/src/pages/Patients.tsx new file mode 100644 index 0000000..9508867 --- /dev/null +++ b/src/pages/Patients.tsx @@ -0,0 +1,284 @@ +import { + Users, + UserPlus, + Search, + Filter, + Calendar, + Eye, + Edit, + Download, + Printer, + User, + Phone, +} from "lucide-react"; + +export default function Patients() { + const patients = [ + { + id: "P001", + name: "Ahmad Rizki", + age: 35, + gender: "Laki-laki", + phone: "+62 812-3456-7890", + lastVisit: "2024-01-15T10:30:00Z", + status: "Active", + }, + { + id: "P002", + name: "Siti Nurhaliza", + age: 28, + gender: "Perempuan", + phone: "+62 813-4567-8901", + lastVisit: "2024-01-14T14:15:00Z", + status: "Active", + }, + { + id: "P003", + name: "Budi Santoso", + age: 42, + gender: "Laki-laki", + phone: "+62 814-5678-9012", + lastVisit: "2024-01-10T09:45:00Z", + status: "Inactive", + }, + { + id: "P004", + name: "Maria Lopez", + age: 29, + gender: "Perempuan", + phone: "+62 815-6789-0123", + lastVisit: "2024-01-13T16:20:00Z", + status: "Active", + }, + { + id: "P005", + name: "Dewi Sartika", + age: 31, + gender: "Perempuan", + phone: "+62 816-7890-1234", + lastVisit: "2024-01-12T11:30:00Z", + status: "Active", + }, + ]; + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + return ( +
+
+ {/* Header */} +
+
+
+
+ +
+
+

+ Manajemen Pasien +

+

+ Kelola data pasien rumah sakit dan informasi kontak +

+
+
+
+ + +
+
+
+ + {/* Stats Cards */} +
+
+
+
+ +
+
+

1,234

+

Total Pasien

+
+
+
+ +
+
+
+ +
+
+

45

+

Pasien Aktif

+
+
+
+ +
+
+
+ +
+
+

24

+

Hari Ini

+
+
+
+ +
+
+
+ +
+
+

8

+

Emergency

+
+
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + {/* Patients Table */} +
+
+ + + + + + + + + + + + {patients.map((patient) => ( + + + + + + + + ))} + +
+ Pasien + + Kontak + + Status + + Kunjungan Terakhir + + Aksi +
+
+
+ {patient.name + .split(" ") + .map((n) => n[0]) + .join("") + .toUpperCase()} +
+
+
+ {patient.name} +
+
+ + {patient.age} tahun • {patient.gender} +
+
+ ID: {patient.id} +
+
+
+
+
+ + {patient.phone} +
+
+ + {patient.status === "Active" ? "Aktif" : "Tidak Aktif"} + + +
+ + {formatDate(patient.lastVisit)} +
+
+
+ + + + +
+
+
+
+
+
+ ); +} diff --git a/src/pages/RoleManagement.tsx b/src/pages/RoleManagement.tsx new file mode 100644 index 0000000..977626d --- /dev/null +++ b/src/pages/RoleManagement.tsx @@ -0,0 +1,464 @@ +import { useState } from "react"; +import { + Shield, + Plus, + Edit, + Trash2, + Search, + Filter, + Users, + CheckCircle, + XCircle, + Settings, + Calendar, + Download, +} from "lucide-react"; +import { sampleRoles, MODULES, ACTIONS } from "../types/roles"; +import type { IRole } from "../types/roles"; + +// Helper function to get proper module display names +const getModuleDisplayName = (module: string) => { + const moduleNames: Record = { + [MODULES.DASHBOARD]: "Dashboard", + [MODULES.COST_RECOMMENDATION]: "Cost Recommendation", + [MODULES.INTEGRASI_DATA_BPJS]: "Integrasi Data - BPJS", + [MODULES.INTEGRASI_DATA_MEDICAL_RECORD]: "Integrasi Data - Medical Record", + [MODULES.PASIEN_MANAJEMEN]: "Pasien - Manajemen Pasien", + [MODULES.PASIEN_MEDICAL_RECORD]: "Pasien - Medical Record Pasien", + [MODULES.PASIEN_BPJS_CODE]: "Pasien - BPJS Code", + [MODULES.USER_MANAGEMENT]: "System Administration - Manajemen User", + [MODULES.ROLE_MANAGEMENT]: "System Administration - Manajemen Role", + }; + return moduleNames[module] || module.replace(/_/g, " "); +}; + +export default function RoleManagement() { + const [roles, setRoles] = useState(sampleRoles); + const [searchTerm, setSearchTerm] = useState(""); + const [selectedRole, setSelectedRole] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalMode, setModalMode] = useState<"create" | "edit">("create"); + const [statusFilter, setStatusFilter] = useState("all"); + const [permissionFilter, setPermissionFilter] = useState("all"); + + const filteredRoles = roles.filter((role) => { + const matchesSearch = + role.name.toLowerCase().includes(searchTerm.toLowerCase()) || + role.description.toLowerCase().includes(searchTerm.toLowerCase()); + + const matchesStatus = + statusFilter === "all" || + (statusFilter === "active" && role.isActive) || + (statusFilter === "inactive" && !role.isActive); + + const matchesPermission = + permissionFilter === "all" || + (permissionFilter === "high" && role.permissions.length >= 8) || + (permissionFilter === "medium" && + role.permissions.length >= 4 && + role.permissions.length <= 7) || + (permissionFilter === "low" && role.permissions.length <= 3); + + return matchesSearch && matchesStatus && matchesPermission; + }); + + const handleCreateRole = () => { + setSelectedRole(null); + setModalMode("create"); + setIsModalOpen(true); + }; + + const handleEditRole = (role: IRole) => { + setSelectedRole(role); + setModalMode("edit"); + setIsModalOpen(true); + }; + + const handleDeleteRole = (roleId: string) => { + if (confirm("Apakah Anda yakin ingin menghapus role ini?")) { + setRoles(roles.filter((role) => role.id !== roleId)); + } + }; + + const handleToggleStatus = (roleId: string) => { + setRoles( + roles.map((role) => + role.id === roleId ? { ...role, isActive: !role.isActive } : role + ) + ); + }; + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("id-ID", { + day: "numeric", + month: "short", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + }; + + return ( +
+
+ {/* Header */} +
+
+
+
+ +
+
+

+ Manajemen Role +

+

+ Kelola role dan permission untuk sistem rumah sakit +

+
+
+
+ + +
+
+
+ + {/* Stats Cards */} +
+
+
+
+

Total Roles

+

+ {roles.length} +

+
+ +
+
+
+
+
+

+ Active Roles +

+

+ {roles.filter((r) => r.isActive).length} +

+
+ +
+
+
+
+
+

+ Inactive Roles +

+

+ {roles.filter((r) => !r.isActive).length} +

+
+ +
+
+
+
+
+

+ Avg Permissions +

+

+ {Math.round( + roles.reduce( + (acc, role) => acc + role.permissions.length, + 0 + ) / roles.length + )} +

+
+ +
+
+
+ + {/* Filters and Search */} +
+
+
+
+ + setSearchTerm(e.target.value)} + className="pl-9 pr-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-purple-500 focus:border-transparent w-80" + /> +
+
+ + + +
+
+
+
+ + {/* Roles Table */} +
+
+ + + + + + + + + + + + + {filteredRoles.map((role) => ( + + + + + + + + + ))} + +
+ Role + + Deskripsi + + Permissions + + Status + + Tanggal Dibuat + + Aksi +
+
+
+ +
+
+
+ {role.name} +
+
+
+
+
+ {role.description} +
+
+
+ + + {role.permissions.length} + + + permissions + +
+
+ + +
+ + {formatDate(role.createdAt)} +
+
+
+ + +
+
+
+
+ + {/* Empty State */} + {filteredRoles.length === 0 && ( +
+ +

+ Tidak ada role ditemukan +

+

+ Mulai dengan membuat role baru untuk sistem rumah sakit. +

+
+ +
+
+ )} + + {/* Role Modal - Create/Edit */} + {isModalOpen && ( +
+
+
+
+

+ {modalMode === "create" ? "Tambah Role Baru" : "Edit Role"} +

+ +
+ +
+
+ + +
+ +
+ +