├── .gitignore ├── LICENSE ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── 128x128.png ├── 256x256.png ├── crops@1x.webp ├── editing@1x.webp ├── filters@1x.webp ├── meta.jpg ├── mobile@1x.webp ├── tools@1x.webp └── tune@1x.webp ├── src ├── App.tsx ├── components │ ├── Button.tsx │ ├── ImageEditor.tsx │ ├── ImageUploader.tsx │ └── LoadingSpinner.tsx ├── config │ └── editorConfig.ts ├── hooks │ └── useImageProcessor.ts ├── index.css ├── main.tsx ├── types │ └── editor.ts ├── utils │ └── imageUtils.ts └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Addy Osmani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Filter - Web-based Image Editor 2 | 3 | Filter is a powerful, web-based image editor built with React and TypeScript. It provides a modern, intuitive interface for quick image edits and filters, optimized for both desktop and mobile devices. 4 | 5 | ![](https://filter.addy.ie/meta.jpg) 6 | 7 | ## ✨ Features 8 | 9 | - 🖼️ **Intuitive Image Editing**: Easy-to-use interface for basic and advanced image modifications 10 | - 📱 **Mobile-Optimized**: Fully responsive design that works great on all devices 11 | - 🎨 **Rich Editing Tools**: Including crop, rotate, adjust, filters, and more 12 | - ⚡ **Fast Processing**: Client-side image processing for quick edits 13 | - 💾 **Easy Export**: Download edited images in various formats 14 | - 🎯 **Preset Crops**: Common aspect ratios for social media and web use 15 | 16 | ## 🚀 Demo 17 | 18 | Try out Filter at: [https://filter.addy.ie](https://filter.addy.ie) 19 | 20 | ## 🛠️ Technology Stack 21 | 22 | - React 18 23 | - TypeScript 24 | - Vite 25 | - Tailwind CSS 26 | - Filerobot Image Editor 27 | - Lucide Icons 28 | 29 | ## 📦 Installation 30 | 31 | 1. Clone the repository: 32 | ```bash 33 | git clone https://github.com/addyosmani/filter.git 34 | cd filter 35 | ``` 36 | 37 | 2. Install dependencies: 38 | ```bash 39 | npm install 40 | ``` 41 | 42 | 3. Start the development server: 43 | ```bash 44 | npm run dev 45 | ``` 46 | 47 | 4. Build for production: 48 | ```bash 49 | npm run build 50 | ``` 51 | 52 | ## 🔧 Configuration 53 | 54 | The editor can be customized through the `src/config/editorConfig.ts` file: 55 | 56 | - Theme colors and typography 57 | - Default tools and tabs 58 | - Crop presets 59 | - Supported fonts 60 | - Translations 61 | 62 | ## 📱 Mobile Support 63 | 64 | Filter is designed to be fully responsive and touch-friendly. Key mobile features include: 65 | 66 | - Touch gesture support 67 | - Mobile-optimized UI 68 | - Responsive layout 69 | - Performance optimizations 70 | 71 | ## 🤝 Contributing 72 | 73 | Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. 74 | 75 | 1. Fork the repository 76 | 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 77 | 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 78 | 4. Push to the branch (`git push origin feature/AmazingFeature`) 79 | 5. Open a Pull Request 80 | 81 | ## 📄 License 82 | 83 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 84 | 85 | ## 🙏 Acknowledgments 86 | 87 | - [Filerobot Image Editor](https://github.com/scaleflex/filerobot-image-editor) 88 | - [Lucide Icons](https://lucide.dev/) 89 | - [Tailwind CSS](https://tailwindcss.com/) 90 | 91 | ## 📞 Support 92 | 93 | For support, please open an issue in the GitHub repository or contact the maintainers. 94 | 95 | --- 96 | 97 | Made with ❤️ by [Addy Osmani](https://github.com/addyosmani) 98 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import globals from 'globals'; 3 | import reactHooks from 'eslint-plugin-react-hooks'; 4 | import reactRefresh from 'eslint-plugin-react-refresh'; 5 | import tseslint from 'typescript-eslint'; 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Filter - Web Image Editor 26 | 27 | 28 |
29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-react-typescript-starter", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vite-react-typescript-starter", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "clsx": "^2.1.0", 12 | "lucide-react": "^0.344.0", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0", 15 | "react-filerobot-image-editor": "4.3.8" 16 | }, 17 | "devDependencies": { 18 | "@types/node": "^20.11.17", 19 | "@types/react": "^18.2.55", 20 | "@types/react-dom": "^18.2.19", 21 | "@vitejs/plugin-react": "^4.2.1", 22 | "autoprefixer": "^10.4.17", 23 | "postcss": "^8.4.35", 24 | "tailwindcss": "^3.4.1", 25 | "typescript": "^5.7.2", 26 | "vite": "^5.1.3" 27 | } 28 | }, 29 | "node_modules/@alloc/quick-lru": { 30 | "version": "5.2.0", 31 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 32 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 33 | "dev": true, 34 | "engines": { 35 | "node": ">=10" 36 | }, 37 | "funding": { 38 | "url": "https://github.com/sponsors/sindresorhus" 39 | } 40 | }, 41 | "node_modules/@ampproject/remapping": { 42 | "version": "2.3.0", 43 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 44 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 45 | "dependencies": { 46 | "@jridgewell/gen-mapping": "^0.3.5", 47 | "@jridgewell/trace-mapping": "^0.3.24" 48 | }, 49 | "engines": { 50 | "node": ">=6.0.0" 51 | } 52 | }, 53 | "node_modules/@babel/code-frame": { 54 | "version": "7.25.7", 55 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", 56 | "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", 57 | "dependencies": { 58 | "@babel/highlight": "^7.25.7", 59 | "picocolors": "^1.0.0" 60 | }, 61 | "engines": { 62 | "node": ">=6.9.0" 63 | } 64 | }, 65 | "node_modules/@babel/compat-data": { 66 | "version": "7.25.7", 67 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", 68 | "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", 69 | "engines": { 70 | "node": ">=6.9.0" 71 | } 72 | }, 73 | "node_modules/@babel/core": { 74 | "version": "7.25.7", 75 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", 76 | "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", 77 | "dependencies": { 78 | "@ampproject/remapping": "^2.2.0", 79 | "@babel/code-frame": "^7.25.7", 80 | "@babel/generator": "^7.25.7", 81 | "@babel/helper-compilation-targets": "^7.25.7", 82 | "@babel/helper-module-transforms": "^7.25.7", 83 | "@babel/helpers": "^7.25.7", 84 | "@babel/parser": "^7.25.7", 85 | "@babel/template": "^7.25.7", 86 | "@babel/traverse": "^7.25.7", 87 | "@babel/types": "^7.25.7", 88 | "convert-source-map": "^2.0.0", 89 | "debug": "^4.1.0", 90 | "gensync": "^1.0.0-beta.2", 91 | "json5": "^2.2.3", 92 | "semver": "^6.3.1" 93 | }, 94 | "engines": { 95 | "node": ">=6.9.0" 96 | }, 97 | "funding": { 98 | "type": "opencollective", 99 | "url": "https://opencollective.com/babel" 100 | } 101 | }, 102 | "node_modules/@babel/generator": { 103 | "version": "7.25.7", 104 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", 105 | "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", 106 | "dependencies": { 107 | "@babel/types": "^7.25.7", 108 | "@jridgewell/gen-mapping": "^0.3.5", 109 | "@jridgewell/trace-mapping": "^0.3.25", 110 | "jsesc": "^3.0.2" 111 | }, 112 | "engines": { 113 | "node": ">=6.9.0" 114 | } 115 | }, 116 | "node_modules/@babel/helper-annotate-as-pure": { 117 | "version": "7.25.9", 118 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", 119 | "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", 120 | "peer": true, 121 | "dependencies": { 122 | "@babel/types": "^7.25.9" 123 | }, 124 | "engines": { 125 | "node": ">=6.9.0" 126 | } 127 | }, 128 | "node_modules/@babel/helper-compilation-targets": { 129 | "version": "7.25.7", 130 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", 131 | "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", 132 | "dependencies": { 133 | "@babel/compat-data": "^7.25.7", 134 | "@babel/helper-validator-option": "^7.25.7", 135 | "browserslist": "^4.24.0", 136 | "lru-cache": "^5.1.1", 137 | "semver": "^6.3.1" 138 | }, 139 | "engines": { 140 | "node": ">=6.9.0" 141 | } 142 | }, 143 | "node_modules/@babel/helper-module-imports": { 144 | "version": "7.25.7", 145 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", 146 | "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", 147 | "dependencies": { 148 | "@babel/traverse": "^7.25.7", 149 | "@babel/types": "^7.25.7" 150 | }, 151 | "engines": { 152 | "node": ">=6.9.0" 153 | } 154 | }, 155 | "node_modules/@babel/helper-module-transforms": { 156 | "version": "7.25.7", 157 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", 158 | "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", 159 | "dependencies": { 160 | "@babel/helper-module-imports": "^7.25.7", 161 | "@babel/helper-simple-access": "^7.25.7", 162 | "@babel/helper-validator-identifier": "^7.25.7", 163 | "@babel/traverse": "^7.25.7" 164 | }, 165 | "engines": { 166 | "node": ">=6.9.0" 167 | }, 168 | "peerDependencies": { 169 | "@babel/core": "^7.0.0" 170 | } 171 | }, 172 | "node_modules/@babel/helper-plugin-utils": { 173 | "version": "7.25.9", 174 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", 175 | "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", 176 | "engines": { 177 | "node": ">=6.9.0" 178 | } 179 | }, 180 | "node_modules/@babel/helper-simple-access": { 181 | "version": "7.25.7", 182 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", 183 | "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", 184 | "dependencies": { 185 | "@babel/traverse": "^7.25.7", 186 | "@babel/types": "^7.25.7" 187 | }, 188 | "engines": { 189 | "node": ">=6.9.0" 190 | } 191 | }, 192 | "node_modules/@babel/helper-string-parser": { 193 | "version": "7.25.9", 194 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 195 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 196 | "engines": { 197 | "node": ">=6.9.0" 198 | } 199 | }, 200 | "node_modules/@babel/helper-validator-identifier": { 201 | "version": "7.25.9", 202 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 203 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 204 | "engines": { 205 | "node": ">=6.9.0" 206 | } 207 | }, 208 | "node_modules/@babel/helper-validator-option": { 209 | "version": "7.25.7", 210 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", 211 | "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", 212 | "engines": { 213 | "node": ">=6.9.0" 214 | } 215 | }, 216 | "node_modules/@babel/helpers": { 217 | "version": "7.25.7", 218 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", 219 | "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", 220 | "dependencies": { 221 | "@babel/template": "^7.25.7", 222 | "@babel/types": "^7.25.7" 223 | }, 224 | "engines": { 225 | "node": ">=6.9.0" 226 | } 227 | }, 228 | "node_modules/@babel/highlight": { 229 | "version": "7.25.7", 230 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", 231 | "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", 232 | "dependencies": { 233 | "@babel/helper-validator-identifier": "^7.25.7", 234 | "chalk": "^2.4.2", 235 | "js-tokens": "^4.0.0", 236 | "picocolors": "^1.0.0" 237 | }, 238 | "engines": { 239 | "node": ">=6.9.0" 240 | } 241 | }, 242 | "node_modules/@babel/parser": { 243 | "version": "7.25.7", 244 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", 245 | "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", 246 | "dependencies": { 247 | "@babel/types": "^7.25.7" 248 | }, 249 | "bin": { 250 | "parser": "bin/babel-parser.js" 251 | }, 252 | "engines": { 253 | "node": ">=6.0.0" 254 | } 255 | }, 256 | "node_modules/@babel/plugin-syntax-jsx": { 257 | "version": "7.25.9", 258 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", 259 | "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", 260 | "peer": true, 261 | "dependencies": { 262 | "@babel/helper-plugin-utils": "^7.25.9" 263 | }, 264 | "engines": { 265 | "node": ">=6.9.0" 266 | }, 267 | "peerDependencies": { 268 | "@babel/core": "^7.0.0-0" 269 | } 270 | }, 271 | "node_modules/@babel/plugin-transform-react-jsx-self": { 272 | "version": "7.25.7", 273 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", 274 | "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", 275 | "dev": true, 276 | "dependencies": { 277 | "@babel/helper-plugin-utils": "^7.25.7" 278 | }, 279 | "engines": { 280 | "node": ">=6.9.0" 281 | }, 282 | "peerDependencies": { 283 | "@babel/core": "^7.0.0-0" 284 | } 285 | }, 286 | "node_modules/@babel/plugin-transform-react-jsx-source": { 287 | "version": "7.25.7", 288 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", 289 | "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", 290 | "dev": true, 291 | "dependencies": { 292 | "@babel/helper-plugin-utils": "^7.25.7" 293 | }, 294 | "engines": { 295 | "node": ">=6.9.0" 296 | }, 297 | "peerDependencies": { 298 | "@babel/core": "^7.0.0-0" 299 | } 300 | }, 301 | "node_modules/@babel/runtime": { 302 | "version": "7.26.0", 303 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", 304 | "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", 305 | "dependencies": { 306 | "regenerator-runtime": "^0.14.0" 307 | }, 308 | "engines": { 309 | "node": ">=6.9.0" 310 | } 311 | }, 312 | "node_modules/@babel/template": { 313 | "version": "7.25.7", 314 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", 315 | "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", 316 | "dependencies": { 317 | "@babel/code-frame": "^7.25.7", 318 | "@babel/parser": "^7.25.7", 319 | "@babel/types": "^7.25.7" 320 | }, 321 | "engines": { 322 | "node": ">=6.9.0" 323 | } 324 | }, 325 | "node_modules/@babel/traverse": { 326 | "version": "7.25.7", 327 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", 328 | "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", 329 | "dependencies": { 330 | "@babel/code-frame": "^7.25.7", 331 | "@babel/generator": "^7.25.7", 332 | "@babel/parser": "^7.25.7", 333 | "@babel/template": "^7.25.7", 334 | "@babel/types": "^7.25.7", 335 | "debug": "^4.3.1", 336 | "globals": "^11.1.0" 337 | }, 338 | "engines": { 339 | "node": ">=6.9.0" 340 | } 341 | }, 342 | "node_modules/@babel/traverse/node_modules/globals": { 343 | "version": "11.12.0", 344 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 345 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 346 | "engines": { 347 | "node": ">=4" 348 | } 349 | }, 350 | "node_modules/@babel/types": { 351 | "version": "7.26.3", 352 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", 353 | "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", 354 | "dependencies": { 355 | "@babel/helper-string-parser": "^7.25.9", 356 | "@babel/helper-validator-identifier": "^7.25.9" 357 | }, 358 | "engines": { 359 | "node": ">=6.9.0" 360 | } 361 | }, 362 | "node_modules/@emotion/is-prop-valid": { 363 | "version": "1.2.2", 364 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", 365 | "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", 366 | "peer": true, 367 | "dependencies": { 368 | "@emotion/memoize": "^0.8.1" 369 | } 370 | }, 371 | "node_modules/@emotion/memoize": { 372 | "version": "0.8.1", 373 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", 374 | "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", 375 | "peer": true 376 | }, 377 | "node_modules/@emotion/stylis": { 378 | "version": "0.8.5", 379 | "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", 380 | "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", 381 | "peer": true 382 | }, 383 | "node_modules/@emotion/unitless": { 384 | "version": "0.7.5", 385 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 386 | "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", 387 | "peer": true 388 | }, 389 | "node_modules/@esbuild/aix-ppc64": { 390 | "version": "0.21.5", 391 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 392 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 393 | "cpu": [ 394 | "ppc64" 395 | ], 396 | "dev": true, 397 | "optional": true, 398 | "os": [ 399 | "aix" 400 | ], 401 | "engines": { 402 | "node": ">=12" 403 | } 404 | }, 405 | "node_modules/@esbuild/android-arm": { 406 | "version": "0.21.5", 407 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 408 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 409 | "cpu": [ 410 | "arm" 411 | ], 412 | "dev": true, 413 | "optional": true, 414 | "os": [ 415 | "android" 416 | ], 417 | "engines": { 418 | "node": ">=12" 419 | } 420 | }, 421 | "node_modules/@esbuild/android-arm64": { 422 | "version": "0.21.5", 423 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 424 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 425 | "cpu": [ 426 | "arm64" 427 | ], 428 | "dev": true, 429 | "optional": true, 430 | "os": [ 431 | "android" 432 | ], 433 | "engines": { 434 | "node": ">=12" 435 | } 436 | }, 437 | "node_modules/@esbuild/android-x64": { 438 | "version": "0.21.5", 439 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 440 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 441 | "cpu": [ 442 | "x64" 443 | ], 444 | "dev": true, 445 | "optional": true, 446 | "os": [ 447 | "android" 448 | ], 449 | "engines": { 450 | "node": ">=12" 451 | } 452 | }, 453 | "node_modules/@esbuild/darwin-arm64": { 454 | "version": "0.21.5", 455 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 456 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 457 | "cpu": [ 458 | "arm64" 459 | ], 460 | "dev": true, 461 | "optional": true, 462 | "os": [ 463 | "darwin" 464 | ], 465 | "engines": { 466 | "node": ">=12" 467 | } 468 | }, 469 | "node_modules/@esbuild/darwin-x64": { 470 | "version": "0.21.5", 471 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 472 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 473 | "cpu": [ 474 | "x64" 475 | ], 476 | "dev": true, 477 | "optional": true, 478 | "os": [ 479 | "darwin" 480 | ], 481 | "engines": { 482 | "node": ">=12" 483 | } 484 | }, 485 | "node_modules/@esbuild/freebsd-arm64": { 486 | "version": "0.21.5", 487 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 488 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 489 | "cpu": [ 490 | "arm64" 491 | ], 492 | "dev": true, 493 | "optional": true, 494 | "os": [ 495 | "freebsd" 496 | ], 497 | "engines": { 498 | "node": ">=12" 499 | } 500 | }, 501 | "node_modules/@esbuild/freebsd-x64": { 502 | "version": "0.21.5", 503 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 504 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 505 | "cpu": [ 506 | "x64" 507 | ], 508 | "dev": true, 509 | "optional": true, 510 | "os": [ 511 | "freebsd" 512 | ], 513 | "engines": { 514 | "node": ">=12" 515 | } 516 | }, 517 | "node_modules/@esbuild/linux-arm": { 518 | "version": "0.21.5", 519 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 520 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 521 | "cpu": [ 522 | "arm" 523 | ], 524 | "dev": true, 525 | "optional": true, 526 | "os": [ 527 | "linux" 528 | ], 529 | "engines": { 530 | "node": ">=12" 531 | } 532 | }, 533 | "node_modules/@esbuild/linux-arm64": { 534 | "version": "0.21.5", 535 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 536 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 537 | "cpu": [ 538 | "arm64" 539 | ], 540 | "dev": true, 541 | "optional": true, 542 | "os": [ 543 | "linux" 544 | ], 545 | "engines": { 546 | "node": ">=12" 547 | } 548 | }, 549 | "node_modules/@esbuild/linux-ia32": { 550 | "version": "0.21.5", 551 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 552 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 553 | "cpu": [ 554 | "ia32" 555 | ], 556 | "dev": true, 557 | "optional": true, 558 | "os": [ 559 | "linux" 560 | ], 561 | "engines": { 562 | "node": ">=12" 563 | } 564 | }, 565 | "node_modules/@esbuild/linux-loong64": { 566 | "version": "0.21.5", 567 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 568 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 569 | "cpu": [ 570 | "loong64" 571 | ], 572 | "dev": true, 573 | "optional": true, 574 | "os": [ 575 | "linux" 576 | ], 577 | "engines": { 578 | "node": ">=12" 579 | } 580 | }, 581 | "node_modules/@esbuild/linux-mips64el": { 582 | "version": "0.21.5", 583 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 584 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 585 | "cpu": [ 586 | "mips64el" 587 | ], 588 | "dev": true, 589 | "optional": true, 590 | "os": [ 591 | "linux" 592 | ], 593 | "engines": { 594 | "node": ">=12" 595 | } 596 | }, 597 | "node_modules/@esbuild/linux-ppc64": { 598 | "version": "0.21.5", 599 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 600 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 601 | "cpu": [ 602 | "ppc64" 603 | ], 604 | "dev": true, 605 | "optional": true, 606 | "os": [ 607 | "linux" 608 | ], 609 | "engines": { 610 | "node": ">=12" 611 | } 612 | }, 613 | "node_modules/@esbuild/linux-riscv64": { 614 | "version": "0.21.5", 615 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 616 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 617 | "cpu": [ 618 | "riscv64" 619 | ], 620 | "dev": true, 621 | "optional": true, 622 | "os": [ 623 | "linux" 624 | ], 625 | "engines": { 626 | "node": ">=12" 627 | } 628 | }, 629 | "node_modules/@esbuild/linux-s390x": { 630 | "version": "0.21.5", 631 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 632 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 633 | "cpu": [ 634 | "s390x" 635 | ], 636 | "dev": true, 637 | "optional": true, 638 | "os": [ 639 | "linux" 640 | ], 641 | "engines": { 642 | "node": ">=12" 643 | } 644 | }, 645 | "node_modules/@esbuild/linux-x64": { 646 | "version": "0.21.5", 647 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 648 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 649 | "cpu": [ 650 | "x64" 651 | ], 652 | "dev": true, 653 | "optional": true, 654 | "os": [ 655 | "linux" 656 | ], 657 | "engines": { 658 | "node": ">=12" 659 | } 660 | }, 661 | "node_modules/@esbuild/netbsd-x64": { 662 | "version": "0.21.5", 663 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 664 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 665 | "cpu": [ 666 | "x64" 667 | ], 668 | "dev": true, 669 | "optional": true, 670 | "os": [ 671 | "netbsd" 672 | ], 673 | "engines": { 674 | "node": ">=12" 675 | } 676 | }, 677 | "node_modules/@esbuild/openbsd-x64": { 678 | "version": "0.21.5", 679 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 680 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 681 | "cpu": [ 682 | "x64" 683 | ], 684 | "dev": true, 685 | "optional": true, 686 | "os": [ 687 | "openbsd" 688 | ], 689 | "engines": { 690 | "node": ">=12" 691 | } 692 | }, 693 | "node_modules/@esbuild/sunos-x64": { 694 | "version": "0.21.5", 695 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 696 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 697 | "cpu": [ 698 | "x64" 699 | ], 700 | "dev": true, 701 | "optional": true, 702 | "os": [ 703 | "sunos" 704 | ], 705 | "engines": { 706 | "node": ">=12" 707 | } 708 | }, 709 | "node_modules/@esbuild/win32-arm64": { 710 | "version": "0.21.5", 711 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 712 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 713 | "cpu": [ 714 | "arm64" 715 | ], 716 | "dev": true, 717 | "optional": true, 718 | "os": [ 719 | "win32" 720 | ], 721 | "engines": { 722 | "node": ">=12" 723 | } 724 | }, 725 | "node_modules/@esbuild/win32-ia32": { 726 | "version": "0.21.5", 727 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 728 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 729 | "cpu": [ 730 | "ia32" 731 | ], 732 | "dev": true, 733 | "optional": true, 734 | "os": [ 735 | "win32" 736 | ], 737 | "engines": { 738 | "node": ">=12" 739 | } 740 | }, 741 | "node_modules/@esbuild/win32-x64": { 742 | "version": "0.21.5", 743 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 744 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 745 | "cpu": [ 746 | "x64" 747 | ], 748 | "dev": true, 749 | "optional": true, 750 | "os": [ 751 | "win32" 752 | ], 753 | "engines": { 754 | "node": ">=12" 755 | } 756 | }, 757 | "node_modules/@isaacs/cliui": { 758 | "version": "8.0.2", 759 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 760 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 761 | "dev": true, 762 | "dependencies": { 763 | "string-width": "^5.1.2", 764 | "string-width-cjs": "npm:string-width@^4.2.0", 765 | "strip-ansi": "^7.0.1", 766 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 767 | "wrap-ansi": "^8.1.0", 768 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 769 | }, 770 | "engines": { 771 | "node": ">=12" 772 | } 773 | }, 774 | "node_modules/@jridgewell/gen-mapping": { 775 | "version": "0.3.5", 776 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 777 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 778 | "dependencies": { 779 | "@jridgewell/set-array": "^1.2.1", 780 | "@jridgewell/sourcemap-codec": "^1.4.10", 781 | "@jridgewell/trace-mapping": "^0.3.24" 782 | }, 783 | "engines": { 784 | "node": ">=6.0.0" 785 | } 786 | }, 787 | "node_modules/@jridgewell/resolve-uri": { 788 | "version": "3.1.2", 789 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 790 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 791 | "engines": { 792 | "node": ">=6.0.0" 793 | } 794 | }, 795 | "node_modules/@jridgewell/set-array": { 796 | "version": "1.2.1", 797 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 798 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 799 | "engines": { 800 | "node": ">=6.0.0" 801 | } 802 | }, 803 | "node_modules/@jridgewell/sourcemap-codec": { 804 | "version": "1.5.0", 805 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 806 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 807 | }, 808 | "node_modules/@jridgewell/trace-mapping": { 809 | "version": "0.3.25", 810 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 811 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 812 | "dependencies": { 813 | "@jridgewell/resolve-uri": "^3.1.0", 814 | "@jridgewell/sourcemap-codec": "^1.4.14" 815 | } 816 | }, 817 | "node_modules/@nodelib/fs.scandir": { 818 | "version": "2.1.5", 819 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 820 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 821 | "dev": true, 822 | "dependencies": { 823 | "@nodelib/fs.stat": "2.0.5", 824 | "run-parallel": "^1.1.9" 825 | }, 826 | "engines": { 827 | "node": ">= 8" 828 | } 829 | }, 830 | "node_modules/@nodelib/fs.stat": { 831 | "version": "2.0.5", 832 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 833 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 834 | "dev": true, 835 | "engines": { 836 | "node": ">= 8" 837 | } 838 | }, 839 | "node_modules/@nodelib/fs.walk": { 840 | "version": "1.2.8", 841 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 842 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 843 | "dev": true, 844 | "dependencies": { 845 | "@nodelib/fs.scandir": "2.1.5", 846 | "fastq": "^1.6.0" 847 | }, 848 | "engines": { 849 | "node": ">= 8" 850 | } 851 | }, 852 | "node_modules/@pkgjs/parseargs": { 853 | "version": "0.11.0", 854 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 855 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 856 | "dev": true, 857 | "optional": true, 858 | "engines": { 859 | "node": ">=14" 860 | } 861 | }, 862 | "node_modules/@popperjs/core": { 863 | "version": "2.11.8", 864 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", 865 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", 866 | "funding": { 867 | "type": "opencollective", 868 | "url": "https://opencollective.com/popperjs" 869 | } 870 | }, 871 | "node_modules/@rollup/rollup-android-arm-eabi": { 872 | "version": "4.24.0", 873 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", 874 | "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", 875 | "cpu": [ 876 | "arm" 877 | ], 878 | "dev": true, 879 | "optional": true, 880 | "os": [ 881 | "android" 882 | ] 883 | }, 884 | "node_modules/@rollup/rollup-android-arm64": { 885 | "version": "4.24.0", 886 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", 887 | "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", 888 | "cpu": [ 889 | "arm64" 890 | ], 891 | "dev": true, 892 | "optional": true, 893 | "os": [ 894 | "android" 895 | ] 896 | }, 897 | "node_modules/@rollup/rollup-darwin-arm64": { 898 | "version": "4.24.0", 899 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", 900 | "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", 901 | "cpu": [ 902 | "arm64" 903 | ], 904 | "dev": true, 905 | "optional": true, 906 | "os": [ 907 | "darwin" 908 | ] 909 | }, 910 | "node_modules/@rollup/rollup-darwin-x64": { 911 | "version": "4.24.0", 912 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", 913 | "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", 914 | "cpu": [ 915 | "x64" 916 | ], 917 | "dev": true, 918 | "optional": true, 919 | "os": [ 920 | "darwin" 921 | ] 922 | }, 923 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 924 | "version": "4.24.0", 925 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", 926 | "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", 927 | "cpu": [ 928 | "arm" 929 | ], 930 | "dev": true, 931 | "optional": true, 932 | "os": [ 933 | "linux" 934 | ] 935 | }, 936 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 937 | "version": "4.24.0", 938 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", 939 | "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", 940 | "cpu": [ 941 | "arm" 942 | ], 943 | "dev": true, 944 | "optional": true, 945 | "os": [ 946 | "linux" 947 | ] 948 | }, 949 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 950 | "version": "4.24.0", 951 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", 952 | "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", 953 | "cpu": [ 954 | "arm64" 955 | ], 956 | "dev": true, 957 | "optional": true, 958 | "os": [ 959 | "linux" 960 | ] 961 | }, 962 | "node_modules/@rollup/rollup-linux-arm64-musl": { 963 | "version": "4.24.0", 964 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", 965 | "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", 966 | "cpu": [ 967 | "arm64" 968 | ], 969 | "dev": true, 970 | "optional": true, 971 | "os": [ 972 | "linux" 973 | ] 974 | }, 975 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 976 | "version": "4.24.0", 977 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", 978 | "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", 979 | "cpu": [ 980 | "ppc64" 981 | ], 982 | "dev": true, 983 | "optional": true, 984 | "os": [ 985 | "linux" 986 | ] 987 | }, 988 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 989 | "version": "4.24.0", 990 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", 991 | "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", 992 | "cpu": [ 993 | "riscv64" 994 | ], 995 | "dev": true, 996 | "optional": true, 997 | "os": [ 998 | "linux" 999 | ] 1000 | }, 1001 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1002 | "version": "4.24.0", 1003 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", 1004 | "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", 1005 | "cpu": [ 1006 | "s390x" 1007 | ], 1008 | "dev": true, 1009 | "optional": true, 1010 | "os": [ 1011 | "linux" 1012 | ] 1013 | }, 1014 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1015 | "version": "4.24.0", 1016 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", 1017 | "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", 1018 | "cpu": [ 1019 | "x64" 1020 | ], 1021 | "dev": true, 1022 | "optional": true, 1023 | "os": [ 1024 | "linux" 1025 | ] 1026 | }, 1027 | "node_modules/@rollup/rollup-linux-x64-musl": { 1028 | "version": "4.24.0", 1029 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", 1030 | "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", 1031 | "cpu": [ 1032 | "x64" 1033 | ], 1034 | "dev": true, 1035 | "optional": true, 1036 | "os": [ 1037 | "linux" 1038 | ] 1039 | }, 1040 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1041 | "version": "4.24.0", 1042 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", 1043 | "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", 1044 | "cpu": [ 1045 | "arm64" 1046 | ], 1047 | "dev": true, 1048 | "optional": true, 1049 | "os": [ 1050 | "win32" 1051 | ] 1052 | }, 1053 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1054 | "version": "4.24.0", 1055 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", 1056 | "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", 1057 | "cpu": [ 1058 | "ia32" 1059 | ], 1060 | "dev": true, 1061 | "optional": true, 1062 | "os": [ 1063 | "win32" 1064 | ] 1065 | }, 1066 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1067 | "version": "4.24.0", 1068 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", 1069 | "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", 1070 | "cpu": [ 1071 | "x64" 1072 | ], 1073 | "dev": true, 1074 | "optional": true, 1075 | "os": [ 1076 | "win32" 1077 | ] 1078 | }, 1079 | "node_modules/@scaleflex/icons": { 1080 | "version": "1.0.0-beta.99", 1081 | "resolved": "https://registry.npmjs.org/@scaleflex/icons/-/icons-1.0.0-beta.99.tgz", 1082 | "integrity": "sha512-LXFn0/7jbtCxv90yO7dt7Mx/n9f5Fvl9bovf8HABFX1Y2V4Iw+egdnm6LGt+fbl61lq7Ea8aFCr/YKH4jmGpvw==", 1083 | "engines": { 1084 | "node": ">=12" 1085 | }, 1086 | "peerDependencies": { 1087 | "react": "^16.13.1", 1088 | "react-dom": "^16.13.1" 1089 | } 1090 | }, 1091 | "node_modules/@scaleflex/ui": { 1092 | "version": "1.0.0-beta.99", 1093 | "resolved": "https://registry.npmjs.org/@scaleflex/ui/-/ui-1.0.0-beta.99.tgz", 1094 | "integrity": "sha512-PglsU+2xHI7MYiLS9BNbPacXTbsc+Nvj7/p0fQ37E9mhJiM2/rRKCJG4YiyDQRpnc9VjyOIF12GDvHAmiFnrCQ==", 1095 | "dependencies": { 1096 | "@popperjs/core": "^2.6.0", 1097 | "@scaleflex/icons": "^1.0.0-beta.99", 1098 | "lodash.merge": "^4.6.2", 1099 | "lodash.throttle": "^4.1.1", 1100 | "polished": "^3.6.6", 1101 | "prop-types": "^15.7.2", 1102 | "react-focus-lock": "^2.4.1", 1103 | "use-callback-ref": "^1.2.4" 1104 | }, 1105 | "engines": { 1106 | "node": ">=12" 1107 | }, 1108 | "peerDependencies": { 1109 | "react": "^16.13.1", 1110 | "react-dom": "^16.13.1", 1111 | "styled-components": "^5.1.0" 1112 | } 1113 | }, 1114 | "node_modules/@types/babel__core": { 1115 | "version": "7.20.5", 1116 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1117 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "@babel/parser": "^7.20.7", 1121 | "@babel/types": "^7.20.7", 1122 | "@types/babel__generator": "*", 1123 | "@types/babel__template": "*", 1124 | "@types/babel__traverse": "*" 1125 | } 1126 | }, 1127 | "node_modules/@types/babel__generator": { 1128 | "version": "7.6.8", 1129 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", 1130 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "@babel/types": "^7.0.0" 1134 | } 1135 | }, 1136 | "node_modules/@types/babel__template": { 1137 | "version": "7.4.4", 1138 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1139 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1140 | "dev": true, 1141 | "dependencies": { 1142 | "@babel/parser": "^7.1.0", 1143 | "@babel/types": "^7.0.0" 1144 | } 1145 | }, 1146 | "node_modules/@types/babel__traverse": { 1147 | "version": "7.20.6", 1148 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", 1149 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", 1150 | "dev": true, 1151 | "dependencies": { 1152 | "@babel/types": "^7.20.7" 1153 | } 1154 | }, 1155 | "node_modules/@types/estree": { 1156 | "version": "1.0.6", 1157 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1158 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1159 | "dev": true 1160 | }, 1161 | "node_modules/@types/node": { 1162 | "version": "20.17.9", 1163 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", 1164 | "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", 1165 | "dev": true, 1166 | "dependencies": { 1167 | "undici-types": "~6.19.2" 1168 | } 1169 | }, 1170 | "node_modules/@types/prop-types": { 1171 | "version": "15.7.13", 1172 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", 1173 | "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" 1174 | }, 1175 | "node_modules/@types/react": { 1176 | "version": "18.3.11", 1177 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", 1178 | "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", 1179 | "dependencies": { 1180 | "@types/prop-types": "*", 1181 | "csstype": "^3.0.2" 1182 | } 1183 | }, 1184 | "node_modules/@types/react-dom": { 1185 | "version": "18.3.0", 1186 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", 1187 | "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", 1188 | "dev": true, 1189 | "dependencies": { 1190 | "@types/react": "*" 1191 | } 1192 | }, 1193 | "node_modules/@types/react-reconciler": { 1194 | "version": "0.28.8", 1195 | "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", 1196 | "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", 1197 | "dependencies": { 1198 | "@types/react": "*" 1199 | } 1200 | }, 1201 | "node_modules/@vitejs/plugin-react": { 1202 | "version": "4.3.2", 1203 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", 1204 | "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", 1205 | "dev": true, 1206 | "dependencies": { 1207 | "@babel/core": "^7.25.2", 1208 | "@babel/plugin-transform-react-jsx-self": "^7.24.7", 1209 | "@babel/plugin-transform-react-jsx-source": "^7.24.7", 1210 | "@types/babel__core": "^7.20.5", 1211 | "react-refresh": "^0.14.2" 1212 | }, 1213 | "engines": { 1214 | "node": "^14.18.0 || >=16.0.0" 1215 | }, 1216 | "peerDependencies": { 1217 | "vite": "^4.2.0 || ^5.0.0" 1218 | } 1219 | }, 1220 | "node_modules/ansi-regex": { 1221 | "version": "6.1.0", 1222 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1223 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1224 | "dev": true, 1225 | "engines": { 1226 | "node": ">=12" 1227 | }, 1228 | "funding": { 1229 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1230 | } 1231 | }, 1232 | "node_modules/ansi-styles": { 1233 | "version": "3.2.1", 1234 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1235 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1236 | "dependencies": { 1237 | "color-convert": "^1.9.0" 1238 | }, 1239 | "engines": { 1240 | "node": ">=4" 1241 | } 1242 | }, 1243 | "node_modules/any-promise": { 1244 | "version": "1.3.0", 1245 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1246 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1247 | "dev": true 1248 | }, 1249 | "node_modules/anymatch": { 1250 | "version": "3.1.3", 1251 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1252 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1253 | "dev": true, 1254 | "dependencies": { 1255 | "normalize-path": "^3.0.0", 1256 | "picomatch": "^2.0.4" 1257 | }, 1258 | "engines": { 1259 | "node": ">= 8" 1260 | } 1261 | }, 1262 | "node_modules/arg": { 1263 | "version": "5.0.2", 1264 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1265 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1266 | "dev": true 1267 | }, 1268 | "node_modules/autoprefixer": { 1269 | "version": "10.4.20", 1270 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", 1271 | "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", 1272 | "dev": true, 1273 | "funding": [ 1274 | { 1275 | "type": "opencollective", 1276 | "url": "https://opencollective.com/postcss/" 1277 | }, 1278 | { 1279 | "type": "tidelift", 1280 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 1281 | }, 1282 | { 1283 | "type": "github", 1284 | "url": "https://github.com/sponsors/ai" 1285 | } 1286 | ], 1287 | "dependencies": { 1288 | "browserslist": "^4.23.3", 1289 | "caniuse-lite": "^1.0.30001646", 1290 | "fraction.js": "^4.3.7", 1291 | "normalize-range": "^0.1.2", 1292 | "picocolors": "^1.0.1", 1293 | "postcss-value-parser": "^4.2.0" 1294 | }, 1295 | "bin": { 1296 | "autoprefixer": "bin/autoprefixer" 1297 | }, 1298 | "engines": { 1299 | "node": "^10 || ^12 || >=14" 1300 | }, 1301 | "peerDependencies": { 1302 | "postcss": "^8.1.0" 1303 | } 1304 | }, 1305 | "node_modules/babel-plugin-styled-components": { 1306 | "version": "2.1.4", 1307 | "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", 1308 | "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", 1309 | "peer": true, 1310 | "dependencies": { 1311 | "@babel/helper-annotate-as-pure": "^7.22.5", 1312 | "@babel/helper-module-imports": "^7.22.5", 1313 | "@babel/plugin-syntax-jsx": "^7.22.5", 1314 | "lodash": "^4.17.21", 1315 | "picomatch": "^2.3.1" 1316 | }, 1317 | "peerDependencies": { 1318 | "styled-components": ">= 2" 1319 | } 1320 | }, 1321 | "node_modules/balanced-match": { 1322 | "version": "1.0.2", 1323 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1324 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1325 | "dev": true 1326 | }, 1327 | "node_modules/binary-extensions": { 1328 | "version": "2.3.0", 1329 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1330 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1331 | "dev": true, 1332 | "engines": { 1333 | "node": ">=8" 1334 | }, 1335 | "funding": { 1336 | "url": "https://github.com/sponsors/sindresorhus" 1337 | } 1338 | }, 1339 | "node_modules/braces": { 1340 | "version": "3.0.3", 1341 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1342 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1343 | "dev": true, 1344 | "dependencies": { 1345 | "fill-range": "^7.1.1" 1346 | }, 1347 | "engines": { 1348 | "node": ">=8" 1349 | } 1350 | }, 1351 | "node_modules/browserslist": { 1352 | "version": "4.24.0", 1353 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", 1354 | "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", 1355 | "funding": [ 1356 | { 1357 | "type": "opencollective", 1358 | "url": "https://opencollective.com/browserslist" 1359 | }, 1360 | { 1361 | "type": "tidelift", 1362 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1363 | }, 1364 | { 1365 | "type": "github", 1366 | "url": "https://github.com/sponsors/ai" 1367 | } 1368 | ], 1369 | "dependencies": { 1370 | "caniuse-lite": "^1.0.30001663", 1371 | "electron-to-chromium": "^1.5.28", 1372 | "node-releases": "^2.0.18", 1373 | "update-browserslist-db": "^1.1.0" 1374 | }, 1375 | "bin": { 1376 | "browserslist": "cli.js" 1377 | }, 1378 | "engines": { 1379 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1380 | } 1381 | }, 1382 | "node_modules/camelcase-css": { 1383 | "version": "2.0.1", 1384 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1385 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1386 | "dev": true, 1387 | "engines": { 1388 | "node": ">= 6" 1389 | } 1390 | }, 1391 | "node_modules/camelize": { 1392 | "version": "1.0.1", 1393 | "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", 1394 | "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", 1395 | "peer": true, 1396 | "funding": { 1397 | "url": "https://github.com/sponsors/ljharb" 1398 | } 1399 | }, 1400 | "node_modules/caniuse-lite": { 1401 | "version": "1.0.30001667", 1402 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", 1403 | "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", 1404 | "funding": [ 1405 | { 1406 | "type": "opencollective", 1407 | "url": "https://opencollective.com/browserslist" 1408 | }, 1409 | { 1410 | "type": "tidelift", 1411 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1412 | }, 1413 | { 1414 | "type": "github", 1415 | "url": "https://github.com/sponsors/ai" 1416 | } 1417 | ] 1418 | }, 1419 | "node_modules/chalk": { 1420 | "version": "2.4.2", 1421 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1422 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1423 | "dependencies": { 1424 | "ansi-styles": "^3.2.1", 1425 | "escape-string-regexp": "^1.0.5", 1426 | "supports-color": "^5.3.0" 1427 | }, 1428 | "engines": { 1429 | "node": ">=4" 1430 | } 1431 | }, 1432 | "node_modules/chokidar": { 1433 | "version": "3.6.0", 1434 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1435 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1436 | "dev": true, 1437 | "dependencies": { 1438 | "anymatch": "~3.1.2", 1439 | "braces": "~3.0.2", 1440 | "glob-parent": "~5.1.2", 1441 | "is-binary-path": "~2.1.0", 1442 | "is-glob": "~4.0.1", 1443 | "normalize-path": "~3.0.0", 1444 | "readdirp": "~3.6.0" 1445 | }, 1446 | "engines": { 1447 | "node": ">= 8.10.0" 1448 | }, 1449 | "funding": { 1450 | "url": "https://paulmillr.com/funding/" 1451 | }, 1452 | "optionalDependencies": { 1453 | "fsevents": "~2.3.2" 1454 | } 1455 | }, 1456 | "node_modules/chokidar/node_modules/glob-parent": { 1457 | "version": "5.1.2", 1458 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1459 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1460 | "dev": true, 1461 | "dependencies": { 1462 | "is-glob": "^4.0.1" 1463 | }, 1464 | "engines": { 1465 | "node": ">= 6" 1466 | } 1467 | }, 1468 | "node_modules/clsx": { 1469 | "version": "2.1.1", 1470 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1471 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1472 | "engines": { 1473 | "node": ">=6" 1474 | } 1475 | }, 1476 | "node_modules/color-convert": { 1477 | "version": "1.9.3", 1478 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1479 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1480 | "dependencies": { 1481 | "color-name": "1.1.3" 1482 | } 1483 | }, 1484 | "node_modules/color-name": { 1485 | "version": "1.1.3", 1486 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1487 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1488 | }, 1489 | "node_modules/commander": { 1490 | "version": "4.1.1", 1491 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1492 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1493 | "dev": true, 1494 | "engines": { 1495 | "node": ">= 6" 1496 | } 1497 | }, 1498 | "node_modules/convert-source-map": { 1499 | "version": "2.0.0", 1500 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1501 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 1502 | }, 1503 | "node_modules/cross-spawn": { 1504 | "version": "7.0.3", 1505 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1506 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "path-key": "^3.1.0", 1510 | "shebang-command": "^2.0.0", 1511 | "which": "^2.0.1" 1512 | }, 1513 | "engines": { 1514 | "node": ">= 8" 1515 | } 1516 | }, 1517 | "node_modules/css-color-keywords": { 1518 | "version": "1.0.0", 1519 | "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", 1520 | "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", 1521 | "peer": true, 1522 | "engines": { 1523 | "node": ">=4" 1524 | } 1525 | }, 1526 | "node_modules/css-to-react-native": { 1527 | "version": "3.2.0", 1528 | "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", 1529 | "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", 1530 | "peer": true, 1531 | "dependencies": { 1532 | "camelize": "^1.0.0", 1533 | "css-color-keywords": "^1.0.0", 1534 | "postcss-value-parser": "^4.0.2" 1535 | } 1536 | }, 1537 | "node_modules/cssesc": { 1538 | "version": "3.0.0", 1539 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1540 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1541 | "dev": true, 1542 | "bin": { 1543 | "cssesc": "bin/cssesc" 1544 | }, 1545 | "engines": { 1546 | "node": ">=4" 1547 | } 1548 | }, 1549 | "node_modules/csstype": { 1550 | "version": "3.1.3", 1551 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1552 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 1553 | }, 1554 | "node_modules/debug": { 1555 | "version": "4.3.7", 1556 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1557 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1558 | "dependencies": { 1559 | "ms": "^2.1.3" 1560 | }, 1561 | "engines": { 1562 | "node": ">=6.0" 1563 | }, 1564 | "peerDependenciesMeta": { 1565 | "supports-color": { 1566 | "optional": true 1567 | } 1568 | } 1569 | }, 1570 | "node_modules/detect-node-es": { 1571 | "version": "1.1.0", 1572 | "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", 1573 | "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" 1574 | }, 1575 | "node_modules/didyoumean": { 1576 | "version": "1.2.2", 1577 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1578 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1579 | "dev": true 1580 | }, 1581 | "node_modules/dlv": { 1582 | "version": "1.1.3", 1583 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1584 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1585 | "dev": true 1586 | }, 1587 | "node_modules/eastasianwidth": { 1588 | "version": "0.2.0", 1589 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1590 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1591 | "dev": true 1592 | }, 1593 | "node_modules/electron-to-chromium": { 1594 | "version": "1.5.33", 1595 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", 1596 | "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==" 1597 | }, 1598 | "node_modules/emoji-regex": { 1599 | "version": "9.2.2", 1600 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1601 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1602 | "dev": true 1603 | }, 1604 | "node_modules/esbuild": { 1605 | "version": "0.21.5", 1606 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1607 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1608 | "dev": true, 1609 | "hasInstallScript": true, 1610 | "bin": { 1611 | "esbuild": "bin/esbuild" 1612 | }, 1613 | "engines": { 1614 | "node": ">=12" 1615 | }, 1616 | "optionalDependencies": { 1617 | "@esbuild/aix-ppc64": "0.21.5", 1618 | "@esbuild/android-arm": "0.21.5", 1619 | "@esbuild/android-arm64": "0.21.5", 1620 | "@esbuild/android-x64": "0.21.5", 1621 | "@esbuild/darwin-arm64": "0.21.5", 1622 | "@esbuild/darwin-x64": "0.21.5", 1623 | "@esbuild/freebsd-arm64": "0.21.5", 1624 | "@esbuild/freebsd-x64": "0.21.5", 1625 | "@esbuild/linux-arm": "0.21.5", 1626 | "@esbuild/linux-arm64": "0.21.5", 1627 | "@esbuild/linux-ia32": "0.21.5", 1628 | "@esbuild/linux-loong64": "0.21.5", 1629 | "@esbuild/linux-mips64el": "0.21.5", 1630 | "@esbuild/linux-ppc64": "0.21.5", 1631 | "@esbuild/linux-riscv64": "0.21.5", 1632 | "@esbuild/linux-s390x": "0.21.5", 1633 | "@esbuild/linux-x64": "0.21.5", 1634 | "@esbuild/netbsd-x64": "0.21.5", 1635 | "@esbuild/openbsd-x64": "0.21.5", 1636 | "@esbuild/sunos-x64": "0.21.5", 1637 | "@esbuild/win32-arm64": "0.21.5", 1638 | "@esbuild/win32-ia32": "0.21.5", 1639 | "@esbuild/win32-x64": "0.21.5" 1640 | } 1641 | }, 1642 | "node_modules/escalade": { 1643 | "version": "3.2.0", 1644 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1645 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1646 | "engines": { 1647 | "node": ">=6" 1648 | } 1649 | }, 1650 | "node_modules/escape-string-regexp": { 1651 | "version": "1.0.5", 1652 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1653 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1654 | "engines": { 1655 | "node": ">=0.8.0" 1656 | } 1657 | }, 1658 | "node_modules/fast-glob": { 1659 | "version": "3.3.2", 1660 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1661 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1662 | "dev": true, 1663 | "dependencies": { 1664 | "@nodelib/fs.stat": "^2.0.2", 1665 | "@nodelib/fs.walk": "^1.2.3", 1666 | "glob-parent": "^5.1.2", 1667 | "merge2": "^1.3.0", 1668 | "micromatch": "^4.0.4" 1669 | }, 1670 | "engines": { 1671 | "node": ">=8.6.0" 1672 | } 1673 | }, 1674 | "node_modules/fast-glob/node_modules/glob-parent": { 1675 | "version": "5.1.2", 1676 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1677 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1678 | "dev": true, 1679 | "dependencies": { 1680 | "is-glob": "^4.0.1" 1681 | }, 1682 | "engines": { 1683 | "node": ">= 6" 1684 | } 1685 | }, 1686 | "node_modules/fastq": { 1687 | "version": "1.17.1", 1688 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1689 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1690 | "dev": true, 1691 | "dependencies": { 1692 | "reusify": "^1.0.4" 1693 | } 1694 | }, 1695 | "node_modules/fill-range": { 1696 | "version": "7.1.1", 1697 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1698 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1699 | "dev": true, 1700 | "dependencies": { 1701 | "to-regex-range": "^5.0.1" 1702 | }, 1703 | "engines": { 1704 | "node": ">=8" 1705 | } 1706 | }, 1707 | "node_modules/focus-lock": { 1708 | "version": "1.3.5", 1709 | "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", 1710 | "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", 1711 | "dependencies": { 1712 | "tslib": "^2.0.3" 1713 | }, 1714 | "engines": { 1715 | "node": ">=10" 1716 | } 1717 | }, 1718 | "node_modules/foreground-child": { 1719 | "version": "3.3.0", 1720 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 1721 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 1722 | "dev": true, 1723 | "dependencies": { 1724 | "cross-spawn": "^7.0.0", 1725 | "signal-exit": "^4.0.1" 1726 | }, 1727 | "engines": { 1728 | "node": ">=14" 1729 | }, 1730 | "funding": { 1731 | "url": "https://github.com/sponsors/isaacs" 1732 | } 1733 | }, 1734 | "node_modules/fraction.js": { 1735 | "version": "4.3.7", 1736 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1737 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1738 | "dev": true, 1739 | "engines": { 1740 | "node": "*" 1741 | }, 1742 | "funding": { 1743 | "type": "patreon", 1744 | "url": "https://github.com/sponsors/rawify" 1745 | } 1746 | }, 1747 | "node_modules/fsevents": { 1748 | "version": "2.3.3", 1749 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1750 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1751 | "dev": true, 1752 | "hasInstallScript": true, 1753 | "optional": true, 1754 | "os": [ 1755 | "darwin" 1756 | ], 1757 | "engines": { 1758 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1759 | } 1760 | }, 1761 | "node_modules/function-bind": { 1762 | "version": "1.1.2", 1763 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1764 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1765 | "dev": true, 1766 | "funding": { 1767 | "url": "https://github.com/sponsors/ljharb" 1768 | } 1769 | }, 1770 | "node_modules/gensync": { 1771 | "version": "1.0.0-beta.2", 1772 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1773 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1774 | "engines": { 1775 | "node": ">=6.9.0" 1776 | } 1777 | }, 1778 | "node_modules/glob": { 1779 | "version": "10.4.5", 1780 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1781 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1782 | "dev": true, 1783 | "dependencies": { 1784 | "foreground-child": "^3.1.0", 1785 | "jackspeak": "^3.1.2", 1786 | "minimatch": "^9.0.4", 1787 | "minipass": "^7.1.2", 1788 | "package-json-from-dist": "^1.0.0", 1789 | "path-scurry": "^1.11.1" 1790 | }, 1791 | "bin": { 1792 | "glob": "dist/esm/bin.mjs" 1793 | }, 1794 | "funding": { 1795 | "url": "https://github.com/sponsors/isaacs" 1796 | } 1797 | }, 1798 | "node_modules/glob-parent": { 1799 | "version": "6.0.2", 1800 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1801 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1802 | "dev": true, 1803 | "dependencies": { 1804 | "is-glob": "^4.0.3" 1805 | }, 1806 | "engines": { 1807 | "node": ">=10.13.0" 1808 | } 1809 | }, 1810 | "node_modules/glob/node_modules/brace-expansion": { 1811 | "version": "2.0.1", 1812 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1813 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1814 | "dev": true, 1815 | "dependencies": { 1816 | "balanced-match": "^1.0.0" 1817 | } 1818 | }, 1819 | "node_modules/glob/node_modules/minimatch": { 1820 | "version": "9.0.5", 1821 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1822 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1823 | "dev": true, 1824 | "dependencies": { 1825 | "brace-expansion": "^2.0.1" 1826 | }, 1827 | "engines": { 1828 | "node": ">=16 || 14 >=14.17" 1829 | }, 1830 | "funding": { 1831 | "url": "https://github.com/sponsors/isaacs" 1832 | } 1833 | }, 1834 | "node_modules/has-flag": { 1835 | "version": "3.0.0", 1836 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1837 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1838 | "engines": { 1839 | "node": ">=4" 1840 | } 1841 | }, 1842 | "node_modules/hasown": { 1843 | "version": "2.0.2", 1844 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1845 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1846 | "dev": true, 1847 | "dependencies": { 1848 | "function-bind": "^1.1.2" 1849 | }, 1850 | "engines": { 1851 | "node": ">= 0.4" 1852 | } 1853 | }, 1854 | "node_modules/hoist-non-react-statics": { 1855 | "version": "3.3.2", 1856 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", 1857 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", 1858 | "peer": true, 1859 | "dependencies": { 1860 | "react-is": "^16.7.0" 1861 | } 1862 | }, 1863 | "node_modules/hoist-non-react-statics/node_modules/react-is": { 1864 | "version": "16.13.1", 1865 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1866 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1867 | "peer": true 1868 | }, 1869 | "node_modules/is-binary-path": { 1870 | "version": "2.1.0", 1871 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1872 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1873 | "dev": true, 1874 | "dependencies": { 1875 | "binary-extensions": "^2.0.0" 1876 | }, 1877 | "engines": { 1878 | "node": ">=8" 1879 | } 1880 | }, 1881 | "node_modules/is-core-module": { 1882 | "version": "2.15.1", 1883 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 1884 | "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 1885 | "dev": true, 1886 | "dependencies": { 1887 | "hasown": "^2.0.2" 1888 | }, 1889 | "engines": { 1890 | "node": ">= 0.4" 1891 | }, 1892 | "funding": { 1893 | "url": "https://github.com/sponsors/ljharb" 1894 | } 1895 | }, 1896 | "node_modules/is-extglob": { 1897 | "version": "2.1.1", 1898 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1899 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1900 | "dev": true, 1901 | "engines": { 1902 | "node": ">=0.10.0" 1903 | } 1904 | }, 1905 | "node_modules/is-fullwidth-code-point": { 1906 | "version": "3.0.0", 1907 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1908 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1909 | "dev": true, 1910 | "engines": { 1911 | "node": ">=8" 1912 | } 1913 | }, 1914 | "node_modules/is-glob": { 1915 | "version": "4.0.3", 1916 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1917 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1918 | "dev": true, 1919 | "dependencies": { 1920 | "is-extglob": "^2.1.1" 1921 | }, 1922 | "engines": { 1923 | "node": ">=0.10.0" 1924 | } 1925 | }, 1926 | "node_modules/is-number": { 1927 | "version": "7.0.0", 1928 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1929 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1930 | "dev": true, 1931 | "engines": { 1932 | "node": ">=0.12.0" 1933 | } 1934 | }, 1935 | "node_modules/isexe": { 1936 | "version": "2.0.0", 1937 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1938 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1939 | "dev": true 1940 | }, 1941 | "node_modules/its-fine": { 1942 | "version": "1.2.5", 1943 | "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", 1944 | "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", 1945 | "dependencies": { 1946 | "@types/react-reconciler": "^0.28.0" 1947 | }, 1948 | "peerDependencies": { 1949 | "react": ">=18.0" 1950 | } 1951 | }, 1952 | "node_modules/jackspeak": { 1953 | "version": "3.4.3", 1954 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1955 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1956 | "dev": true, 1957 | "dependencies": { 1958 | "@isaacs/cliui": "^8.0.2" 1959 | }, 1960 | "funding": { 1961 | "url": "https://github.com/sponsors/isaacs" 1962 | }, 1963 | "optionalDependencies": { 1964 | "@pkgjs/parseargs": "^0.11.0" 1965 | } 1966 | }, 1967 | "node_modules/jiti": { 1968 | "version": "1.21.6", 1969 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", 1970 | "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", 1971 | "dev": true, 1972 | "bin": { 1973 | "jiti": "bin/jiti.js" 1974 | } 1975 | }, 1976 | "node_modules/js-tokens": { 1977 | "version": "4.0.0", 1978 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1979 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1980 | }, 1981 | "node_modules/jsesc": { 1982 | "version": "3.0.2", 1983 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 1984 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 1985 | "bin": { 1986 | "jsesc": "bin/jsesc" 1987 | }, 1988 | "engines": { 1989 | "node": ">=6" 1990 | } 1991 | }, 1992 | "node_modules/json5": { 1993 | "version": "2.2.3", 1994 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1995 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1996 | "bin": { 1997 | "json5": "lib/cli.js" 1998 | }, 1999 | "engines": { 2000 | "node": ">=6" 2001 | } 2002 | }, 2003 | "node_modules/konva": { 2004 | "version": "8.4.2", 2005 | "resolved": "https://registry.npmjs.org/konva/-/konva-8.4.2.tgz", 2006 | "integrity": "sha512-4VQcrgj/PI8ydJjtLcTuinHBE8o0WGX0YoRwbiN5mpYQiC52aOzJ0XbpKNDJdRvORQphK5LP+jeM0hQJEYIuUA==", 2007 | "funding": [ 2008 | { 2009 | "type": "patreon", 2010 | "url": "https://www.patreon.com/lavrton" 2011 | }, 2012 | { 2013 | "type": "opencollective", 2014 | "url": "https://opencollective.com/konva" 2015 | }, 2016 | { 2017 | "type": "github", 2018 | "url": "https://github.com/sponsors/lavrton" 2019 | } 2020 | ] 2021 | }, 2022 | "node_modules/lilconfig": { 2023 | "version": "2.1.0", 2024 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 2025 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 2026 | "dev": true, 2027 | "engines": { 2028 | "node": ">=10" 2029 | } 2030 | }, 2031 | "node_modules/lines-and-columns": { 2032 | "version": "1.2.4", 2033 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2034 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2035 | "dev": true 2036 | }, 2037 | "node_modules/lodash": { 2038 | "version": "4.17.21", 2039 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2040 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2041 | "peer": true 2042 | }, 2043 | "node_modules/lodash.merge": { 2044 | "version": "4.6.2", 2045 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2046 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 2047 | }, 2048 | "node_modules/lodash.throttle": { 2049 | "version": "4.1.1", 2050 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 2051 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" 2052 | }, 2053 | "node_modules/loose-envify": { 2054 | "version": "1.4.0", 2055 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2056 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2057 | "dependencies": { 2058 | "js-tokens": "^3.0.0 || ^4.0.0" 2059 | }, 2060 | "bin": { 2061 | "loose-envify": "cli.js" 2062 | } 2063 | }, 2064 | "node_modules/lru-cache": { 2065 | "version": "5.1.1", 2066 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2067 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2068 | "dependencies": { 2069 | "yallist": "^3.0.2" 2070 | } 2071 | }, 2072 | "node_modules/lucide-react": { 2073 | "version": "0.344.0", 2074 | "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.344.0.tgz", 2075 | "integrity": "sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==", 2076 | "peerDependencies": { 2077 | "react": "^16.5.1 || ^17.0.0 || ^18.0.0" 2078 | } 2079 | }, 2080 | "node_modules/merge2": { 2081 | "version": "1.4.1", 2082 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2083 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2084 | "dev": true, 2085 | "engines": { 2086 | "node": ">= 8" 2087 | } 2088 | }, 2089 | "node_modules/micromatch": { 2090 | "version": "4.0.8", 2091 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2092 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2093 | "dev": true, 2094 | "dependencies": { 2095 | "braces": "^3.0.3", 2096 | "picomatch": "^2.3.1" 2097 | }, 2098 | "engines": { 2099 | "node": ">=8.6" 2100 | } 2101 | }, 2102 | "node_modules/minipass": { 2103 | "version": "7.1.2", 2104 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2105 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2106 | "dev": true, 2107 | "engines": { 2108 | "node": ">=16 || 14 >=14.17" 2109 | } 2110 | }, 2111 | "node_modules/ms": { 2112 | "version": "2.1.3", 2113 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2114 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2115 | }, 2116 | "node_modules/mz": { 2117 | "version": "2.7.0", 2118 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2119 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2120 | "dev": true, 2121 | "dependencies": { 2122 | "any-promise": "^1.0.0", 2123 | "object-assign": "^4.0.1", 2124 | "thenify-all": "^1.0.0" 2125 | } 2126 | }, 2127 | "node_modules/nanoid": { 2128 | "version": "3.3.7", 2129 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2130 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2131 | "dev": true, 2132 | "funding": [ 2133 | { 2134 | "type": "github", 2135 | "url": "https://github.com/sponsors/ai" 2136 | } 2137 | ], 2138 | "bin": { 2139 | "nanoid": "bin/nanoid.cjs" 2140 | }, 2141 | "engines": { 2142 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2143 | } 2144 | }, 2145 | "node_modules/node-releases": { 2146 | "version": "2.0.18", 2147 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", 2148 | "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" 2149 | }, 2150 | "node_modules/normalize-path": { 2151 | "version": "3.0.0", 2152 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2153 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2154 | "dev": true, 2155 | "engines": { 2156 | "node": ">=0.10.0" 2157 | } 2158 | }, 2159 | "node_modules/normalize-range": { 2160 | "version": "0.1.2", 2161 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2162 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2163 | "dev": true, 2164 | "engines": { 2165 | "node": ">=0.10.0" 2166 | } 2167 | }, 2168 | "node_modules/object-assign": { 2169 | "version": "4.1.1", 2170 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2171 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2172 | "engines": { 2173 | "node": ">=0.10.0" 2174 | } 2175 | }, 2176 | "node_modules/object-hash": { 2177 | "version": "3.0.0", 2178 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2179 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2180 | "dev": true, 2181 | "engines": { 2182 | "node": ">= 6" 2183 | } 2184 | }, 2185 | "node_modules/package-json-from-dist": { 2186 | "version": "1.0.1", 2187 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2188 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2189 | "dev": true 2190 | }, 2191 | "node_modules/path-key": { 2192 | "version": "3.1.1", 2193 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2194 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2195 | "dev": true, 2196 | "engines": { 2197 | "node": ">=8" 2198 | } 2199 | }, 2200 | "node_modules/path-parse": { 2201 | "version": "1.0.7", 2202 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2203 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2204 | "dev": true 2205 | }, 2206 | "node_modules/path-scurry": { 2207 | "version": "1.11.1", 2208 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2209 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2210 | "dev": true, 2211 | "dependencies": { 2212 | "lru-cache": "^10.2.0", 2213 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2214 | }, 2215 | "engines": { 2216 | "node": ">=16 || 14 >=14.18" 2217 | }, 2218 | "funding": { 2219 | "url": "https://github.com/sponsors/isaacs" 2220 | } 2221 | }, 2222 | "node_modules/path-scurry/node_modules/lru-cache": { 2223 | "version": "10.4.3", 2224 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 2225 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 2226 | "dev": true 2227 | }, 2228 | "node_modules/picocolors": { 2229 | "version": "1.1.0", 2230 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2231 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" 2232 | }, 2233 | "node_modules/picomatch": { 2234 | "version": "2.3.1", 2235 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2236 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2237 | "engines": { 2238 | "node": ">=8.6" 2239 | }, 2240 | "funding": { 2241 | "url": "https://github.com/sponsors/jonschlinkert" 2242 | } 2243 | }, 2244 | "node_modules/pify": { 2245 | "version": "2.3.0", 2246 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2247 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2248 | "dev": true, 2249 | "engines": { 2250 | "node": ">=0.10.0" 2251 | } 2252 | }, 2253 | "node_modules/pirates": { 2254 | "version": "4.0.6", 2255 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2256 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2257 | "dev": true, 2258 | "engines": { 2259 | "node": ">= 6" 2260 | } 2261 | }, 2262 | "node_modules/polished": { 2263 | "version": "3.7.2", 2264 | "resolved": "https://registry.npmjs.org/polished/-/polished-3.7.2.tgz", 2265 | "integrity": "sha512-pQKtpZGmsZrW8UUpQMAnR7s3ppHeMQVNyMDKtUyKwuvDmklzcEyM5Kllb3JyE/sE/x7arDmyd35i+4vp99H6sQ==", 2266 | "dependencies": { 2267 | "@babel/runtime": "^7.12.5" 2268 | }, 2269 | "engines": { 2270 | "node": ">=10" 2271 | } 2272 | }, 2273 | "node_modules/postcss": { 2274 | "version": "8.4.47", 2275 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 2276 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 2277 | "dev": true, 2278 | "funding": [ 2279 | { 2280 | "type": "opencollective", 2281 | "url": "https://opencollective.com/postcss/" 2282 | }, 2283 | { 2284 | "type": "tidelift", 2285 | "url": "https://tidelift.com/funding/github/npm/postcss" 2286 | }, 2287 | { 2288 | "type": "github", 2289 | "url": "https://github.com/sponsors/ai" 2290 | } 2291 | ], 2292 | "dependencies": { 2293 | "nanoid": "^3.3.7", 2294 | "picocolors": "^1.1.0", 2295 | "source-map-js": "^1.2.1" 2296 | }, 2297 | "engines": { 2298 | "node": "^10 || ^12 || >=14" 2299 | } 2300 | }, 2301 | "node_modules/postcss-import": { 2302 | "version": "15.1.0", 2303 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 2304 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 2305 | "dev": true, 2306 | "dependencies": { 2307 | "postcss-value-parser": "^4.0.0", 2308 | "read-cache": "^1.0.0", 2309 | "resolve": "^1.1.7" 2310 | }, 2311 | "engines": { 2312 | "node": ">=14.0.0" 2313 | }, 2314 | "peerDependencies": { 2315 | "postcss": "^8.0.0" 2316 | } 2317 | }, 2318 | "node_modules/postcss-js": { 2319 | "version": "4.0.1", 2320 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 2321 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 2322 | "dev": true, 2323 | "dependencies": { 2324 | "camelcase-css": "^2.0.1" 2325 | }, 2326 | "engines": { 2327 | "node": "^12 || ^14 || >= 16" 2328 | }, 2329 | "funding": { 2330 | "type": "opencollective", 2331 | "url": "https://opencollective.com/postcss/" 2332 | }, 2333 | "peerDependencies": { 2334 | "postcss": "^8.4.21" 2335 | } 2336 | }, 2337 | "node_modules/postcss-load-config": { 2338 | "version": "4.0.2", 2339 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 2340 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 2341 | "dev": true, 2342 | "funding": [ 2343 | { 2344 | "type": "opencollective", 2345 | "url": "https://opencollective.com/postcss/" 2346 | }, 2347 | { 2348 | "type": "github", 2349 | "url": "https://github.com/sponsors/ai" 2350 | } 2351 | ], 2352 | "dependencies": { 2353 | "lilconfig": "^3.0.0", 2354 | "yaml": "^2.3.4" 2355 | }, 2356 | "engines": { 2357 | "node": ">= 14" 2358 | }, 2359 | "peerDependencies": { 2360 | "postcss": ">=8.0.9", 2361 | "ts-node": ">=9.0.0" 2362 | }, 2363 | "peerDependenciesMeta": { 2364 | "postcss": { 2365 | "optional": true 2366 | }, 2367 | "ts-node": { 2368 | "optional": true 2369 | } 2370 | } 2371 | }, 2372 | "node_modules/postcss-load-config/node_modules/lilconfig": { 2373 | "version": "3.1.2", 2374 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", 2375 | "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", 2376 | "dev": true, 2377 | "engines": { 2378 | "node": ">=14" 2379 | }, 2380 | "funding": { 2381 | "url": "https://github.com/sponsors/antonk52" 2382 | } 2383 | }, 2384 | "node_modules/postcss-nested": { 2385 | "version": "6.2.0", 2386 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 2387 | "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 2388 | "dev": true, 2389 | "funding": [ 2390 | { 2391 | "type": "opencollective", 2392 | "url": "https://opencollective.com/postcss/" 2393 | }, 2394 | { 2395 | "type": "github", 2396 | "url": "https://github.com/sponsors/ai" 2397 | } 2398 | ], 2399 | "dependencies": { 2400 | "postcss-selector-parser": "^6.1.1" 2401 | }, 2402 | "engines": { 2403 | "node": ">=12.0" 2404 | }, 2405 | "peerDependencies": { 2406 | "postcss": "^8.2.14" 2407 | } 2408 | }, 2409 | "node_modules/postcss-selector-parser": { 2410 | "version": "6.1.2", 2411 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 2412 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 2413 | "dev": true, 2414 | "dependencies": { 2415 | "cssesc": "^3.0.0", 2416 | "util-deprecate": "^1.0.2" 2417 | }, 2418 | "engines": { 2419 | "node": ">=4" 2420 | } 2421 | }, 2422 | "node_modules/postcss-value-parser": { 2423 | "version": "4.2.0", 2424 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2425 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 2426 | }, 2427 | "node_modules/prop-types": { 2428 | "version": "15.7.2", 2429 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 2430 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 2431 | "dependencies": { 2432 | "loose-envify": "^1.4.0", 2433 | "object-assign": "^4.1.1", 2434 | "react-is": "^16.8.1" 2435 | } 2436 | }, 2437 | "node_modules/prop-types/node_modules/react-is": { 2438 | "version": "16.13.1", 2439 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2440 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2441 | }, 2442 | "node_modules/queue-microtask": { 2443 | "version": "1.2.3", 2444 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2445 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2446 | "dev": true, 2447 | "funding": [ 2448 | { 2449 | "type": "github", 2450 | "url": "https://github.com/sponsors/feross" 2451 | }, 2452 | { 2453 | "type": "patreon", 2454 | "url": "https://www.patreon.com/feross" 2455 | }, 2456 | { 2457 | "type": "consulting", 2458 | "url": "https://feross.org/support" 2459 | } 2460 | ] 2461 | }, 2462 | "node_modules/react": { 2463 | "version": "18.2.0", 2464 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 2465 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 2466 | "dependencies": { 2467 | "loose-envify": "^1.1.0" 2468 | }, 2469 | "engines": { 2470 | "node": ">=0.10.0" 2471 | } 2472 | }, 2473 | "node_modules/react-clientside-effect": { 2474 | "version": "1.2.6", 2475 | "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", 2476 | "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", 2477 | "dependencies": { 2478 | "@babel/runtime": "^7.12.13" 2479 | }, 2480 | "peerDependencies": { 2481 | "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" 2482 | } 2483 | }, 2484 | "node_modules/react-dom": { 2485 | "version": "18.2.0", 2486 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 2487 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 2488 | "dependencies": { 2489 | "loose-envify": "^1.1.0", 2490 | "scheduler": "^0.23.0" 2491 | }, 2492 | "peerDependencies": { 2493 | "react": "^18.2.0" 2494 | } 2495 | }, 2496 | "node_modules/react-filerobot-image-editor": { 2497 | "version": "4.3.8", 2498 | "resolved": "https://registry.npmjs.org/react-filerobot-image-editor/-/react-filerobot-image-editor-4.3.8.tgz", 2499 | "integrity": "sha512-DMpROVcGkw4kPjr7HcaYdtIK5MhpaXUYHczVSxBOpZUja1lEMGpM7DbjuiiG1p+7gAH9rZXavgH4U4OxS43rrw==", 2500 | "dependencies": { 2501 | "@babel/runtime": "^7.17.2", 2502 | "@scaleflex/icons": "1.0.0-beta.99", 2503 | "@scaleflex/ui": "1.0.0-beta.99", 2504 | "konva": "8.4.2", 2505 | "prop-types": "15.7.2", 2506 | "react-konva": "18.2.4" 2507 | }, 2508 | "peerDependencies": { 2509 | "react": "18.2.0", 2510 | "react-dom": "18.2.0", 2511 | "styled-components": ">=5.3.5" 2512 | } 2513 | }, 2514 | "node_modules/react-focus-lock": { 2515 | "version": "2.13.2", 2516 | "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.2.tgz", 2517 | "integrity": "sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ==", 2518 | "dependencies": { 2519 | "@babel/runtime": "^7.0.0", 2520 | "focus-lock": "^1.3.5", 2521 | "prop-types": "^15.6.2", 2522 | "react-clientside-effect": "^1.2.6", 2523 | "use-callback-ref": "^1.3.2", 2524 | "use-sidecar": "^1.1.2" 2525 | }, 2526 | "peerDependencies": { 2527 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 2528 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2529 | }, 2530 | "peerDependenciesMeta": { 2531 | "@types/react": { 2532 | "optional": true 2533 | } 2534 | } 2535 | }, 2536 | "node_modules/react-is": { 2537 | "version": "19.0.0", 2538 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", 2539 | "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", 2540 | "peer": true 2541 | }, 2542 | "node_modules/react-konva": { 2543 | "version": "18.2.4", 2544 | "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.4.tgz", 2545 | "integrity": "sha512-cVo0+L8PjUSrSAMLlutwRiI1t8koU4Z6EOsbrWxuXvTwNXG3qd0wFoNBBVGjOQgZX9hqufbK7NEQdfqlKve9jQ==", 2546 | "funding": [ 2547 | { 2548 | "type": "patreon", 2549 | "url": "https://www.patreon.com/lavrton" 2550 | }, 2551 | { 2552 | "type": "opencollective", 2553 | "url": "https://opencollective.com/konva" 2554 | }, 2555 | { 2556 | "type": "github", 2557 | "url": "https://github.com/sponsors/lavrton" 2558 | } 2559 | ], 2560 | "dependencies": { 2561 | "its-fine": "^1.0.6", 2562 | "react-reconciler": "~0.29.0", 2563 | "scheduler": "^0.23.0" 2564 | }, 2565 | "peerDependencies": { 2566 | "konva": "^8.0.1 || ^7.2.5", 2567 | "react": ">=18.0.0", 2568 | "react-dom": ">=18.0.0" 2569 | } 2570 | }, 2571 | "node_modules/react-konva/node_modules/react-reconciler": { 2572 | "version": "0.29.2", 2573 | "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", 2574 | "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", 2575 | "dependencies": { 2576 | "loose-envify": "^1.1.0", 2577 | "scheduler": "^0.23.2" 2578 | }, 2579 | "engines": { 2580 | "node": ">=0.10.0" 2581 | }, 2582 | "peerDependencies": { 2583 | "react": "^18.3.1" 2584 | } 2585 | }, 2586 | "node_modules/react-refresh": { 2587 | "version": "0.14.2", 2588 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", 2589 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 2590 | "dev": true, 2591 | "engines": { 2592 | "node": ">=0.10.0" 2593 | } 2594 | }, 2595 | "node_modules/read-cache": { 2596 | "version": "1.0.0", 2597 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2598 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2599 | "dev": true, 2600 | "dependencies": { 2601 | "pify": "^2.3.0" 2602 | } 2603 | }, 2604 | "node_modules/readdirp": { 2605 | "version": "3.6.0", 2606 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2607 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2608 | "dev": true, 2609 | "dependencies": { 2610 | "picomatch": "^2.2.1" 2611 | }, 2612 | "engines": { 2613 | "node": ">=8.10.0" 2614 | } 2615 | }, 2616 | "node_modules/regenerator-runtime": { 2617 | "version": "0.14.1", 2618 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2619 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 2620 | }, 2621 | "node_modules/resolve": { 2622 | "version": "1.22.8", 2623 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2624 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2625 | "dev": true, 2626 | "dependencies": { 2627 | "is-core-module": "^2.13.0", 2628 | "path-parse": "^1.0.7", 2629 | "supports-preserve-symlinks-flag": "^1.0.0" 2630 | }, 2631 | "bin": { 2632 | "resolve": "bin/resolve" 2633 | }, 2634 | "funding": { 2635 | "url": "https://github.com/sponsors/ljharb" 2636 | } 2637 | }, 2638 | "node_modules/reusify": { 2639 | "version": "1.0.4", 2640 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2641 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2642 | "dev": true, 2643 | "engines": { 2644 | "iojs": ">=1.0.0", 2645 | "node": ">=0.10.0" 2646 | } 2647 | }, 2648 | "node_modules/rollup": { 2649 | "version": "4.24.0", 2650 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", 2651 | "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", 2652 | "dev": true, 2653 | "dependencies": { 2654 | "@types/estree": "1.0.6" 2655 | }, 2656 | "bin": { 2657 | "rollup": "dist/bin/rollup" 2658 | }, 2659 | "engines": { 2660 | "node": ">=18.0.0", 2661 | "npm": ">=8.0.0" 2662 | }, 2663 | "optionalDependencies": { 2664 | "@rollup/rollup-android-arm-eabi": "4.24.0", 2665 | "@rollup/rollup-android-arm64": "4.24.0", 2666 | "@rollup/rollup-darwin-arm64": "4.24.0", 2667 | "@rollup/rollup-darwin-x64": "4.24.0", 2668 | "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", 2669 | "@rollup/rollup-linux-arm-musleabihf": "4.24.0", 2670 | "@rollup/rollup-linux-arm64-gnu": "4.24.0", 2671 | "@rollup/rollup-linux-arm64-musl": "4.24.0", 2672 | "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", 2673 | "@rollup/rollup-linux-riscv64-gnu": "4.24.0", 2674 | "@rollup/rollup-linux-s390x-gnu": "4.24.0", 2675 | "@rollup/rollup-linux-x64-gnu": "4.24.0", 2676 | "@rollup/rollup-linux-x64-musl": "4.24.0", 2677 | "@rollup/rollup-win32-arm64-msvc": "4.24.0", 2678 | "@rollup/rollup-win32-ia32-msvc": "4.24.0", 2679 | "@rollup/rollup-win32-x64-msvc": "4.24.0", 2680 | "fsevents": "~2.3.2" 2681 | } 2682 | }, 2683 | "node_modules/run-parallel": { 2684 | "version": "1.2.0", 2685 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2686 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2687 | "dev": true, 2688 | "funding": [ 2689 | { 2690 | "type": "github", 2691 | "url": "https://github.com/sponsors/feross" 2692 | }, 2693 | { 2694 | "type": "patreon", 2695 | "url": "https://www.patreon.com/feross" 2696 | }, 2697 | { 2698 | "type": "consulting", 2699 | "url": "https://feross.org/support" 2700 | } 2701 | ], 2702 | "dependencies": { 2703 | "queue-microtask": "^1.2.2" 2704 | } 2705 | }, 2706 | "node_modules/scheduler": { 2707 | "version": "0.23.2", 2708 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", 2709 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", 2710 | "dependencies": { 2711 | "loose-envify": "^1.1.0" 2712 | } 2713 | }, 2714 | "node_modules/semver": { 2715 | "version": "6.3.1", 2716 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2717 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2718 | "bin": { 2719 | "semver": "bin/semver.js" 2720 | } 2721 | }, 2722 | "node_modules/shallowequal": { 2723 | "version": "1.1.0", 2724 | "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", 2725 | "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", 2726 | "peer": true 2727 | }, 2728 | "node_modules/shebang-command": { 2729 | "version": "2.0.0", 2730 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2731 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2732 | "dev": true, 2733 | "dependencies": { 2734 | "shebang-regex": "^3.0.0" 2735 | }, 2736 | "engines": { 2737 | "node": ">=8" 2738 | } 2739 | }, 2740 | "node_modules/shebang-regex": { 2741 | "version": "3.0.0", 2742 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2743 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2744 | "dev": true, 2745 | "engines": { 2746 | "node": ">=8" 2747 | } 2748 | }, 2749 | "node_modules/signal-exit": { 2750 | "version": "4.1.0", 2751 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2752 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2753 | "dev": true, 2754 | "engines": { 2755 | "node": ">=14" 2756 | }, 2757 | "funding": { 2758 | "url": "https://github.com/sponsors/isaacs" 2759 | } 2760 | }, 2761 | "node_modules/source-map-js": { 2762 | "version": "1.2.1", 2763 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2764 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2765 | "dev": true, 2766 | "engines": { 2767 | "node": ">=0.10.0" 2768 | } 2769 | }, 2770 | "node_modules/string-width": { 2771 | "version": "5.1.2", 2772 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2773 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2774 | "dev": true, 2775 | "dependencies": { 2776 | "eastasianwidth": "^0.2.0", 2777 | "emoji-regex": "^9.2.2", 2778 | "strip-ansi": "^7.0.1" 2779 | }, 2780 | "engines": { 2781 | "node": ">=12" 2782 | }, 2783 | "funding": { 2784 | "url": "https://github.com/sponsors/sindresorhus" 2785 | } 2786 | }, 2787 | "node_modules/string-width-cjs": { 2788 | "name": "string-width", 2789 | "version": "4.2.3", 2790 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2791 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2792 | "dev": true, 2793 | "dependencies": { 2794 | "emoji-regex": "^8.0.0", 2795 | "is-fullwidth-code-point": "^3.0.0", 2796 | "strip-ansi": "^6.0.1" 2797 | }, 2798 | "engines": { 2799 | "node": ">=8" 2800 | } 2801 | }, 2802 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2803 | "version": "5.0.1", 2804 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2805 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2806 | "dev": true, 2807 | "engines": { 2808 | "node": ">=8" 2809 | } 2810 | }, 2811 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2812 | "version": "8.0.0", 2813 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2814 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2815 | "dev": true 2816 | }, 2817 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2818 | "version": "6.0.1", 2819 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2820 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2821 | "dev": true, 2822 | "dependencies": { 2823 | "ansi-regex": "^5.0.1" 2824 | }, 2825 | "engines": { 2826 | "node": ">=8" 2827 | } 2828 | }, 2829 | "node_modules/strip-ansi": { 2830 | "version": "7.1.0", 2831 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2832 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2833 | "dev": true, 2834 | "dependencies": { 2835 | "ansi-regex": "^6.0.1" 2836 | }, 2837 | "engines": { 2838 | "node": ">=12" 2839 | }, 2840 | "funding": { 2841 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2842 | } 2843 | }, 2844 | "node_modules/strip-ansi-cjs": { 2845 | "name": "strip-ansi", 2846 | "version": "6.0.1", 2847 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2848 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2849 | "dev": true, 2850 | "dependencies": { 2851 | "ansi-regex": "^5.0.1" 2852 | }, 2853 | "engines": { 2854 | "node": ">=8" 2855 | } 2856 | }, 2857 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2858 | "version": "5.0.1", 2859 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2860 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2861 | "dev": true, 2862 | "engines": { 2863 | "node": ">=8" 2864 | } 2865 | }, 2866 | "node_modules/styled-components": { 2867 | "version": "5.3.11", 2868 | "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", 2869 | "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", 2870 | "peer": true, 2871 | "dependencies": { 2872 | "@babel/helper-module-imports": "^7.0.0", 2873 | "@babel/traverse": "^7.4.5", 2874 | "@emotion/is-prop-valid": "^1.1.0", 2875 | "@emotion/stylis": "^0.8.4", 2876 | "@emotion/unitless": "^0.7.4", 2877 | "babel-plugin-styled-components": ">= 1.12.0", 2878 | "css-to-react-native": "^3.0.0", 2879 | "hoist-non-react-statics": "^3.0.0", 2880 | "shallowequal": "^1.1.0", 2881 | "supports-color": "^5.5.0" 2882 | }, 2883 | "engines": { 2884 | "node": ">=10" 2885 | }, 2886 | "funding": { 2887 | "type": "opencollective", 2888 | "url": "https://opencollective.com/styled-components" 2889 | }, 2890 | "peerDependencies": { 2891 | "react": ">= 16.8.0", 2892 | "react-dom": ">= 16.8.0", 2893 | "react-is": ">= 16.8.0" 2894 | } 2895 | }, 2896 | "node_modules/sucrase": { 2897 | "version": "3.35.0", 2898 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2899 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2900 | "dev": true, 2901 | "dependencies": { 2902 | "@jridgewell/gen-mapping": "^0.3.2", 2903 | "commander": "^4.0.0", 2904 | "glob": "^10.3.10", 2905 | "lines-and-columns": "^1.1.6", 2906 | "mz": "^2.7.0", 2907 | "pirates": "^4.0.1", 2908 | "ts-interface-checker": "^0.1.9" 2909 | }, 2910 | "bin": { 2911 | "sucrase": "bin/sucrase", 2912 | "sucrase-node": "bin/sucrase-node" 2913 | }, 2914 | "engines": { 2915 | "node": ">=16 || 14 >=14.17" 2916 | } 2917 | }, 2918 | "node_modules/supports-color": { 2919 | "version": "5.5.0", 2920 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2921 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2922 | "dependencies": { 2923 | "has-flag": "^3.0.0" 2924 | }, 2925 | "engines": { 2926 | "node": ">=4" 2927 | } 2928 | }, 2929 | "node_modules/supports-preserve-symlinks-flag": { 2930 | "version": "1.0.0", 2931 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2932 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2933 | "dev": true, 2934 | "engines": { 2935 | "node": ">= 0.4" 2936 | }, 2937 | "funding": { 2938 | "url": "https://github.com/sponsors/ljharb" 2939 | } 2940 | }, 2941 | "node_modules/tailwindcss": { 2942 | "version": "3.4.13", 2943 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", 2944 | "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", 2945 | "dev": true, 2946 | "dependencies": { 2947 | "@alloc/quick-lru": "^5.2.0", 2948 | "arg": "^5.0.2", 2949 | "chokidar": "^3.5.3", 2950 | "didyoumean": "^1.2.2", 2951 | "dlv": "^1.1.3", 2952 | "fast-glob": "^3.3.0", 2953 | "glob-parent": "^6.0.2", 2954 | "is-glob": "^4.0.3", 2955 | "jiti": "^1.21.0", 2956 | "lilconfig": "^2.1.0", 2957 | "micromatch": "^4.0.5", 2958 | "normalize-path": "^3.0.0", 2959 | "object-hash": "^3.0.0", 2960 | "picocolors": "^1.0.0", 2961 | "postcss": "^8.4.23", 2962 | "postcss-import": "^15.1.0", 2963 | "postcss-js": "^4.0.1", 2964 | "postcss-load-config": "^4.0.1", 2965 | "postcss-nested": "^6.0.1", 2966 | "postcss-selector-parser": "^6.0.11", 2967 | "resolve": "^1.22.2", 2968 | "sucrase": "^3.32.0" 2969 | }, 2970 | "bin": { 2971 | "tailwind": "lib/cli.js", 2972 | "tailwindcss": "lib/cli.js" 2973 | }, 2974 | "engines": { 2975 | "node": ">=14.0.0" 2976 | } 2977 | }, 2978 | "node_modules/thenify": { 2979 | "version": "3.3.1", 2980 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2981 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2982 | "dev": true, 2983 | "dependencies": { 2984 | "any-promise": "^1.0.0" 2985 | } 2986 | }, 2987 | "node_modules/thenify-all": { 2988 | "version": "1.6.0", 2989 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2990 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2991 | "dev": true, 2992 | "dependencies": { 2993 | "thenify": ">= 3.1.0 < 4" 2994 | }, 2995 | "engines": { 2996 | "node": ">=0.8" 2997 | } 2998 | }, 2999 | "node_modules/to-regex-range": { 3000 | "version": "5.0.1", 3001 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3002 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3003 | "dev": true, 3004 | "dependencies": { 3005 | "is-number": "^7.0.0" 3006 | }, 3007 | "engines": { 3008 | "node": ">=8.0" 3009 | } 3010 | }, 3011 | "node_modules/ts-interface-checker": { 3012 | "version": "0.1.13", 3013 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 3014 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 3015 | "dev": true 3016 | }, 3017 | "node_modules/tslib": { 3018 | "version": "2.8.1", 3019 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3020 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 3021 | }, 3022 | "node_modules/typescript": { 3023 | "version": "5.7.2", 3024 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", 3025 | "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", 3026 | "dev": true, 3027 | "bin": { 3028 | "tsc": "bin/tsc", 3029 | "tsserver": "bin/tsserver" 3030 | }, 3031 | "engines": { 3032 | "node": ">=14.17" 3033 | } 3034 | }, 3035 | "node_modules/undici-types": { 3036 | "version": "6.19.8", 3037 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 3038 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 3039 | "dev": true 3040 | }, 3041 | "node_modules/update-browserslist-db": { 3042 | "version": "1.1.1", 3043 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", 3044 | "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", 3045 | "funding": [ 3046 | { 3047 | "type": "opencollective", 3048 | "url": "https://opencollective.com/browserslist" 3049 | }, 3050 | { 3051 | "type": "tidelift", 3052 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3053 | }, 3054 | { 3055 | "type": "github", 3056 | "url": "https://github.com/sponsors/ai" 3057 | } 3058 | ], 3059 | "dependencies": { 3060 | "escalade": "^3.2.0", 3061 | "picocolors": "^1.1.0" 3062 | }, 3063 | "bin": { 3064 | "update-browserslist-db": "cli.js" 3065 | }, 3066 | "peerDependencies": { 3067 | "browserslist": ">= 4.21.0" 3068 | } 3069 | }, 3070 | "node_modules/use-callback-ref": { 3071 | "version": "1.3.2", 3072 | "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", 3073 | "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", 3074 | "dependencies": { 3075 | "tslib": "^2.0.0" 3076 | }, 3077 | "engines": { 3078 | "node": ">=10" 3079 | }, 3080 | "peerDependencies": { 3081 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 3082 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3083 | }, 3084 | "peerDependenciesMeta": { 3085 | "@types/react": { 3086 | "optional": true 3087 | } 3088 | } 3089 | }, 3090 | "node_modules/use-sidecar": { 3091 | "version": "1.1.2", 3092 | "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", 3093 | "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", 3094 | "dependencies": { 3095 | "detect-node-es": "^1.1.0", 3096 | "tslib": "^2.0.0" 3097 | }, 3098 | "engines": { 3099 | "node": ">=10" 3100 | }, 3101 | "peerDependencies": { 3102 | "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", 3103 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3104 | }, 3105 | "peerDependenciesMeta": { 3106 | "@types/react": { 3107 | "optional": true 3108 | } 3109 | } 3110 | }, 3111 | "node_modules/util-deprecate": { 3112 | "version": "1.0.2", 3113 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3114 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3115 | "dev": true 3116 | }, 3117 | "node_modules/vite": { 3118 | "version": "5.4.8", 3119 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", 3120 | "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", 3121 | "dev": true, 3122 | "dependencies": { 3123 | "esbuild": "^0.21.3", 3124 | "postcss": "^8.4.43", 3125 | "rollup": "^4.20.0" 3126 | }, 3127 | "bin": { 3128 | "vite": "bin/vite.js" 3129 | }, 3130 | "engines": { 3131 | "node": "^18.0.0 || >=20.0.0" 3132 | }, 3133 | "funding": { 3134 | "url": "https://github.com/vitejs/vite?sponsor=1" 3135 | }, 3136 | "optionalDependencies": { 3137 | "fsevents": "~2.3.3" 3138 | }, 3139 | "peerDependencies": { 3140 | "@types/node": "^18.0.0 || >=20.0.0", 3141 | "less": "*", 3142 | "lightningcss": "^1.21.0", 3143 | "sass": "*", 3144 | "sass-embedded": "*", 3145 | "stylus": "*", 3146 | "sugarss": "*", 3147 | "terser": "^5.4.0" 3148 | }, 3149 | "peerDependenciesMeta": { 3150 | "@types/node": { 3151 | "optional": true 3152 | }, 3153 | "less": { 3154 | "optional": true 3155 | }, 3156 | "lightningcss": { 3157 | "optional": true 3158 | }, 3159 | "sass": { 3160 | "optional": true 3161 | }, 3162 | "sass-embedded": { 3163 | "optional": true 3164 | }, 3165 | "stylus": { 3166 | "optional": true 3167 | }, 3168 | "sugarss": { 3169 | "optional": true 3170 | }, 3171 | "terser": { 3172 | "optional": true 3173 | } 3174 | } 3175 | }, 3176 | "node_modules/which": { 3177 | "version": "2.0.2", 3178 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3179 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3180 | "dev": true, 3181 | "dependencies": { 3182 | "isexe": "^2.0.0" 3183 | }, 3184 | "bin": { 3185 | "node-which": "bin/node-which" 3186 | }, 3187 | "engines": { 3188 | "node": ">= 8" 3189 | } 3190 | }, 3191 | "node_modules/wrap-ansi": { 3192 | "version": "8.1.0", 3193 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3194 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3195 | "dev": true, 3196 | "dependencies": { 3197 | "ansi-styles": "^6.1.0", 3198 | "string-width": "^5.0.1", 3199 | "strip-ansi": "^7.0.1" 3200 | }, 3201 | "engines": { 3202 | "node": ">=12" 3203 | }, 3204 | "funding": { 3205 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3206 | } 3207 | }, 3208 | "node_modules/wrap-ansi-cjs": { 3209 | "name": "wrap-ansi", 3210 | "version": "7.0.0", 3211 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3212 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3213 | "dev": true, 3214 | "dependencies": { 3215 | "ansi-styles": "^4.0.0", 3216 | "string-width": "^4.1.0", 3217 | "strip-ansi": "^6.0.0" 3218 | }, 3219 | "engines": { 3220 | "node": ">=10" 3221 | }, 3222 | "funding": { 3223 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3224 | } 3225 | }, 3226 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3227 | "version": "5.0.1", 3228 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3229 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3230 | "dev": true, 3231 | "engines": { 3232 | "node": ">=8" 3233 | } 3234 | }, 3235 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3236 | "version": "4.3.0", 3237 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3238 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3239 | "dev": true, 3240 | "dependencies": { 3241 | "color-convert": "^2.0.1" 3242 | }, 3243 | "engines": { 3244 | "node": ">=8" 3245 | }, 3246 | "funding": { 3247 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3248 | } 3249 | }, 3250 | "node_modules/wrap-ansi-cjs/node_modules/color-convert": { 3251 | "version": "2.0.1", 3252 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3253 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3254 | "dev": true, 3255 | "dependencies": { 3256 | "color-name": "~1.1.4" 3257 | }, 3258 | "engines": { 3259 | "node": ">=7.0.0" 3260 | } 3261 | }, 3262 | "node_modules/wrap-ansi-cjs/node_modules/color-name": { 3263 | "version": "1.1.4", 3264 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3265 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3266 | "dev": true 3267 | }, 3268 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3269 | "version": "8.0.0", 3270 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3271 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3272 | "dev": true 3273 | }, 3274 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3275 | "version": "4.2.3", 3276 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3277 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3278 | "dev": true, 3279 | "dependencies": { 3280 | "emoji-regex": "^8.0.0", 3281 | "is-fullwidth-code-point": "^3.0.0", 3282 | "strip-ansi": "^6.0.1" 3283 | }, 3284 | "engines": { 3285 | "node": ">=8" 3286 | } 3287 | }, 3288 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3289 | "version": "6.0.1", 3290 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3291 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3292 | "dev": true, 3293 | "dependencies": { 3294 | "ansi-regex": "^5.0.1" 3295 | }, 3296 | "engines": { 3297 | "node": ">=8" 3298 | } 3299 | }, 3300 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 3301 | "version": "6.2.1", 3302 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 3303 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 3304 | "dev": true, 3305 | "engines": { 3306 | "node": ">=12" 3307 | }, 3308 | "funding": { 3309 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3310 | } 3311 | }, 3312 | "node_modules/yallist": { 3313 | "version": "3.1.1", 3314 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3315 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 3316 | }, 3317 | "node_modules/yaml": { 3318 | "version": "2.5.1", 3319 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", 3320 | "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", 3321 | "dev": true, 3322 | "bin": { 3323 | "yaml": "bin.mjs" 3324 | }, 3325 | "engines": { 3326 | "node": ">= 14" 3327 | } 3328 | } 3329 | } 3330 | } 3331 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-react-typescript-starter", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "clsx": "^2.1.0", 14 | "lucide-react": "^0.344.0", 15 | "react": "18.2.0", 16 | "react-dom": "18.2.0", 17 | "react-filerobot-image-editor": "4.3.8" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^20.11.17", 21 | "@types/react": "^18.2.55", 22 | "@types/react-dom": "^18.2.19", 23 | "@vitejs/plugin-react": "^4.2.1", 24 | "autoprefixer": "^10.4.17", 25 | "postcss": "^8.4.35", 26 | "tailwindcss": "^3.4.1", 27 | "typescript": "^5.7.2", 28 | "vite": "^5.1.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/128x128.png -------------------------------------------------------------------------------- /public/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/256x256.png -------------------------------------------------------------------------------- /public/crops@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/crops@1x.webp -------------------------------------------------------------------------------- /public/editing@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/editing@1x.webp -------------------------------------------------------------------------------- /public/filters@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/filters@1x.webp -------------------------------------------------------------------------------- /public/meta.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/meta.jpg -------------------------------------------------------------------------------- /public/mobile@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/mobile@1x.webp -------------------------------------------------------------------------------- /public/tools@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/tools@1x.webp -------------------------------------------------------------------------------- /public/tune@1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/filter/fc7acbb2b6373b0a437776284c72524f83819210/public/tune@1x.webp -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { ImageUploader } from './components/ImageUploader'; 3 | import { ImageEditor } from './components/ImageEditor'; 4 | import { Button } from './components/Button'; 5 | import { X } from 'lucide-react'; 6 | import { createDownloadLink } from './utils/imageUtils'; 7 | 8 | function App() { 9 | const [selectedImage, setSelectedImage] = useState(null); 10 | const [editedImage, setEditedImage] = useState(null); 11 | 12 | const handleImageSelect = (file: File) => { 13 | const reader = new FileReader(); 14 | reader.onload = (e) => { 15 | if (e.target?.result) { 16 | setSelectedImage(e.target.result as string); 17 | } 18 | }; 19 | reader.readAsDataURL(file); 20 | }; 21 | 22 | const handleSave = (editedImageUrl: string) => { 23 | setEditedImage(editedImageUrl); 24 | setSelectedImage(null); 25 | }; 26 | 27 | const handleDownload = () => { 28 | if (editedImage) { 29 | createDownloadLink(editedImage, 'edited-image.png'); 30 | } 31 | }; 32 | 33 | const handleClose = () => { 34 | setSelectedImage(null); 35 | }; 36 | 37 | const handleReset = () => { 38 | setEditedImage(null); 39 | setSelectedImage(null); 40 | }; 41 | 42 | return ( 43 |
44 | {!selectedImage && !editedImage && ( 45 |
46 |

Filter

47 |
48 |

49 | A powerful, web-based image editor with an intuitive interface for quick edits and filters. Local and privacy-friendly. 50 |

51 | 52 |
53 |
54 |
55 | Intuitive Editing 56 | 🖼️ Intuitive Editing 57 |

Easy-to-use interface for basic and advanced modifications

58 |
59 |
60 | Fab Filters 61 | ⚡ Fab Filters 62 |

Full of beautiful filters to make your photos stand out

63 |
64 |
65 | Rich Tools 66 | 🎨 Rich Tools 67 |

Crop, rotate, adjust, and more

68 |
69 |
70 | Mobile-Optimized 71 | 📱 Mobile-Optimized 72 |

Fully responsive design that works on all devices

73 |
74 |
75 | Fine-tuning 76 | 💄 Fine-tuning 77 |

Brightness, Contrast, HSV and more.

78 |
79 |
80 | Preset Crops 81 | 🎯 Preset Crops 82 |

Common aspect ratios for social media and web

83 |
84 |
85 |
86 | )} 87 | 88 | {selectedImage && ( 89 |
90 | 95 |
96 | )} 97 | 98 | {editedImage && !selectedImage && ( 99 |
100 |
101 | Edited 106 |
107 | 110 |
111 |
112 |
113 | 116 |
117 |
118 | )} 119 | 122 |
123 | ); 124 | } 125 | 126 | export default App; -------------------------------------------------------------------------------- /src/components/Button.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { clsx } from 'clsx'; 3 | 4 | interface ButtonProps extends React.ButtonHTMLAttributes { 5 | variant?: 'primary' | 'secondary'; 6 | children: React.ReactNode; 7 | } 8 | 9 | export const Button: React.FC = ({ 10 | variant = 'primary', 11 | children, 12 | className, 13 | ...props 14 | }) => { 15 | return ( 16 | 29 | ); 30 | }; -------------------------------------------------------------------------------- /src/components/ImageEditor.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import FilerobotImageEditor, { TABS, TOOLS } from 'react-filerobot-image-editor'; 3 | import { createEditorConfig } from '../config/editorConfig'; 4 | 5 | interface ImageEditorProps { 6 | imageUrl: string; 7 | onClose: () => void; 8 | onSave: (editedImageUrl: string) => void; 9 | } 10 | 11 | export const ImageEditor: React.FC = ({ 12 | imageUrl, 13 | onClose, 14 | onSave, 15 | }) => { 16 | const config = createEditorConfig(imageUrl); 17 | 18 | return ( 19 |
20 | { 24 | onSave(editedImageObject.imageBase64); 25 | }} 26 | onClose={onClose} 27 | defaultTabId={TABS.ADJUST} 28 | defaultToolId={TOOLS.CROP} 29 | savingPixelRatio={2} 30 | previewPixelRatio={2} 31 | /> 32 |
33 | ); 34 | }; -------------------------------------------------------------------------------- /src/components/ImageUploader.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react'; 2 | import { Upload } from 'lucide-react'; 3 | import { Button } from './Button'; 4 | import { LoadingSpinner } from './LoadingSpinner'; 5 | import { useImageProcessor } from '../hooks/useImageProcessor'; 6 | import { validateImageFile } from '../utils/imageUtils'; 7 | 8 | interface ImageUploaderProps { 9 | onImageSelect: (file: File) => void; 10 | } 11 | 12 | export const ImageUploader: React.FC = ({ onImageSelect }) => { 13 | const { processImage, isProcessing } = useImageProcessor(); 14 | const fileInputRef = useRef(null); 15 | 16 | const handleFileChange = async (event: React.ChangeEvent) => { 17 | const file = event.target.files?.[0]; 18 | if (!file) return; 19 | 20 | try { 21 | validateImageFile(file); 22 | await processImage(file); 23 | onImageSelect(file); 24 | } catch (error) { 25 | console.error('Error processing image:', error); 26 | alert(error instanceof Error ? error.message : 'Failed to process image'); 27 | } finally { 28 | // Reset the input so the same file can be selected again 29 | if (fileInputRef.current) { 30 | fileInputRef.current.value = ''; 31 | } 32 | } 33 | }; 34 | 35 | const handleButtonClick = () => { 36 | fileInputRef.current?.click(); 37 | }; 38 | 39 | return ( 40 |
41 | {isProcessing ? ( 42 | 43 | ) : ( 44 | <> 45 | 52 | 56 | 57 | )} 58 |
59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /src/components/LoadingSpinner.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const LoadingSpinner: React.FC = () => { 4 | return ( 5 |
6 |
7 | Processing image... 8 |
9 | ); 10 | }; -------------------------------------------------------------------------------- /src/config/editorConfig.ts: -------------------------------------------------------------------------------- 1 | import { CropPreset, EditorConfig } from '../types/editor'; 2 | import { TABS } from 'react-filerobot-image-editor'; 3 | import Social from '@scaleflex/icons/social'; 4 | 5 | const cropPresets: CropPreset[] = [ 6 | { 7 | titleKey: 'square', 8 | descriptionKey: '1:1', 9 | ratio: 1, 10 | }, 11 | { 12 | titleKey: 'portrait', 13 | descriptionKey: '3:4', 14 | ratio: 3 / 4, 15 | }, 16 | { 17 | titleKey: 'socialMedia', // will be translated into Social Media as backend contains this translation key 18 | icon: Social, // React component, string or HTML Element 19 | groups: [ 20 | { 21 | titleKey: 'linkedIn', 22 | items: [ 23 | { 24 | titleKey: 'profilePhoto', 25 | width: 400, 26 | height: 400, 27 | descriptionKey: 'liProfilePhotoSize', 28 | disableManualResize: false, 29 | }, 30 | { 31 | titleKey: 'profileCoverPhoto', 32 | width: 1584, 33 | height: 396, 34 | descriptionKey: 'liProfileCoverPhotoSize', 35 | }, 36 | { 37 | titleKey: 'blogPostPhoto', 38 | width: 1200, 39 | height: 627, 40 | descriptionKey: 'liBlogPostPhotoSize', 41 | }, 42 | { 43 | titleKey: 'companyLogo', 44 | width: 300, 45 | height: 300, 46 | descriptionKey: 'liCompanyLogoSize', 47 | }, 48 | { 49 | titleKey: 'companyPageCover', 50 | width: 1128, 51 | height: 191, 52 | descriptionKey: 'liCompanyPageCoverSize', 53 | }, 54 | ], 55 | }, 56 | { 57 | titleKey: 'x', 58 | items: [ 59 | { 60 | titleKey: 'profilePhoto', 61 | width: 400, 62 | height: 400, 63 | descriptionKey: 'twProfilePhotoSize', 64 | }, 65 | { 66 | titleKey: 'headerPhoto', 67 | width: 1500, 68 | height: 500, 69 | descriptionKey: 'twHeaderPhotoSize', 70 | }, 71 | { 72 | titleKey: 'inStreamPhoto', 73 | width: 1600, 74 | height: 1900, 75 | descriptionKey: 'twInStreamPhotoSize', 76 | }, 77 | ], 78 | }, 79 | { 80 | titleKey: 'instagram', 81 | items: [ 82 | { 83 | titleKey: 'profilePhoto', 84 | width: 320, 85 | height: 320, 86 | descriptionKey: 'igProfilePhotoSize', 87 | }, 88 | { 89 | titleKey: 'feedPortraitPhoto', 90 | width: 1080, 91 | height: 1350, 92 | descriptionKey: 'igFeedPortraitPhotoSize', 93 | }, 94 | { 95 | titleKey: 'feedLandscapePhoto', 96 | width: 1080, 97 | height: 566, 98 | descriptionKey: 'igFeedLandscapePhotoSize', 99 | }, 100 | { 101 | titleKey: 'feedSquarePhoto', 102 | width: 1080, 103 | height: 1080, 104 | descriptionKey: 'igFeedSquarePhotoSize', 105 | }, 106 | { 107 | titleKey: 'storyPhoto', 108 | width: 1080, 109 | height: 1920, 110 | descriptionKey: 'igStoryPhotoSize', 111 | }, 112 | ], 113 | }, 114 | { 115 | titleKey: 'facebook', 116 | items: [ 117 | { 118 | titleKey: 'profilePhoto', 119 | width: 170, 120 | height: 170, 121 | descriptionKey: 'fbProfilePhotoSize', 122 | }, 123 | { 124 | titleKey: 'profileCoverPhoto', 125 | width: 851, 126 | height: 315, 127 | descriptionKey: 'fbProfileCoverPhotoSize', 128 | }, 129 | { 130 | titleKey: 'eventCoverPhoto', 131 | width: 1200, 132 | height: 628, 133 | descriptionKey: 'fbEventCoverPhotoSize', 134 | }, 135 | { 136 | titleKey: 'timelinePhoto', 137 | width: 1200, 138 | height: 630, 139 | descriptionKey: 'fbTimelinePhotoSize', 140 | }, 141 | { 142 | titleKey: 'storyPhoto', 143 | width: 1080, 144 | height: 1920, 145 | descriptionKey: 'fbStoryPhotoSize', 146 | }, 147 | ], 148 | }, 149 | ], 150 | }, 151 | ]; 152 | 153 | export const createEditorConfig = (imageUrl: string): EditorConfig => ({ 154 | source: imageUrl, 155 | defaultSavedImageType: 'png', 156 | defaultSavedImageName: 'edited-image', 157 | theme: { 158 | palette: { 159 | 'txt-primary': '#ffffff', 160 | 'txt-primary-invert': '#262626', 161 | 'txt-secondary': '#cccccc', 162 | 'txt-secondary-invert': '#4d4d4d', 163 | 'txt-placeholder': '#999999', 164 | 'accent-primary': '#2196f3', 165 | 'accent-primary-hover': '#1976d2', 166 | 'accent-primary-active': 'rgb(204 228 247)', // Button active color 167 | 'accent-primary-disabled': '#bbdefb', 168 | 'bg-primary': '#262626', 169 | 'bg-primary-hover': 'rgb(73 72 72)', 170 | 'bg-primary-active': '#333333', 171 | 'bg-primary-0-5-opacity': 'rgba(38, 38, 38, 0.5)', 172 | 'bg-secondary': '#2d2d2d', 173 | 'icons-primary': '#ffffff', 174 | 'icons-primary-opacity-0-6': 'rgba(255, 255, 255, 0.6)', 175 | 'icons-secondary': '#cccccc', 176 | 'icons-placeholder': '#999999', 177 | 'btn-primary-text': '#ffffff', 178 | 'btn-disabled-text': '#666666', 179 | 'link-primary': '#2196f3', 180 | 'link-hover': '#1976d2', 181 | 'link-active': '#1565c0', 182 | 'borders-primary': '#404040', 183 | 'borders-secondary': '#333333', 184 | 'borders-strong': '#666666', 185 | 'borders-invert': '#ffffff', 186 | 'border-active-bottom': '#2196f3', 187 | 'active-secondary': '#404040', 188 | 'active-secondary-hover': '#4d4d4d', 189 | 'active-secondary-active': '#595959', 190 | }, 191 | typography: { 192 | fontFamily: 'Inter, system-ui, sans-serif' 193 | }, 194 | }, 195 | annotationsCommon: { 196 | fill: '#2196f3', 197 | }, 198 | Text: { 199 | text: 'Add text...', 200 | fonts: [ 201 | { label: 'Arial', value: 'Arial' }, 202 | { label: 'Helvetica', value: 'Helvetica' }, 203 | { label: 'Inter', value: 'Inter' }, 204 | { label: 'Times New Roman', value: 'Times New Roman' }, 205 | { label: 'Courier New', value: 'Courier New' }, 206 | { label: 'Georgia', value: 'Georgia' }, 207 | { label: 'Verdana', value: 'Verdana' }, 208 | { label: 'Geneva', value: 'Geneva' }, 209 | { label: 'Trebuchet MS', value: 'Trebuchet MS' }, 210 | { label: 'Arial Black', value: 'Arial Black' }, 211 | { label: 'Impact', value: 'Impact' }, 212 | { label: 'Comic Sans MS', value: 'Comic Sans MS' }, 213 | { label: 'Lucida Console', value: 'Lucida Console' }, 214 | { label: 'Tahoma', value: 'Tahoma' }, 215 | { label: 'Palatino Linotype', value: 'Palatino Linotype' }, 216 | { label: 'Book Antiqua', value: 'Book Antiqua' }, 217 | { label: 'Arial Narrow', value: 'Arial Narrow' }, 218 | { label: 'Century Gothic', value: 'Century Gothic' }, 219 | { label: 'Lucida Sans Unicode', value: 'Lucida Sans Unicode' }, 220 | { label: 'Garamond', value: 'Garamond' } 221 | ], 222 | }, 223 | translations: { 224 | profile: 'Profile', 225 | coverPhoto: 'Cover Photo', 226 | facebook: 'Facebook', 227 | socialMedia: 'Social Media', 228 | classicTv: 'Classic TV', 229 | wide: 'Widescreen', 230 | square: 'Square', 231 | portrait: 'Portrait', 232 | }, 233 | Crop: { 234 | presetsItems: cropPresets, 235 | autoResize: true, 236 | }, 237 | defaultTabId: TABS.ADJUST, 238 | defaultToolId: 'Crop', 239 | observePluginContainerSize: true, 240 | showCanvasOnly: false, 241 | }); 242 | -------------------------------------------------------------------------------- /src/hooks/useImageProcessor.ts: -------------------------------------------------------------------------------- 1 | import { useState, useCallback } from 'react'; 2 | 3 | interface ImageProcessorResult { 4 | processImage: (file: File) => Promise; 5 | isProcessing: boolean; 6 | } 7 | 8 | export const useImageProcessor = (): ImageProcessorResult => { 9 | const [isProcessing, setIsProcessing] = useState(false); 10 | 11 | const processImage = useCallback(async (file: File): Promise => { 12 | setIsProcessing(true); 13 | try { 14 | // Create an image object to ensure the file is valid 15 | const image = new Image(); 16 | const imageUrl = URL.createObjectURL(file); 17 | 18 | await new Promise((resolve, reject) => { 19 | image.onload = resolve; 20 | image.onerror = () => reject(new Error('Failed to load image')); 21 | image.src = imageUrl; 22 | }); 23 | 24 | // Cleanup 25 | URL.revokeObjectURL(imageUrl); 26 | } finally { 27 | setIsProcessing(false); 28 | } 29 | }, []); 30 | 31 | return { 32 | processImage, 33 | isProcessing 34 | }; 35 | }; -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | color-scheme: dark; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | overflow-x: hidden; 15 | } 16 | 17 | .filerobot-image-editor-root { 18 | height: 100vh !important; 19 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import App from './App'; 4 | import './index.css'; 5 | 6 | const container = document.getElementById('root'); 7 | 8 | if (!container) { 9 | throw new Error('Root element not found'); 10 | } 11 | 12 | const root = createRoot(container); 13 | 14 | root.render( 15 | 16 | 17 | 18 | ); -------------------------------------------------------------------------------- /src/types/editor.ts: -------------------------------------------------------------------------------- 1 | export interface CropPreset { 2 | titleKey: string; 3 | descriptionKey: string; 4 | ratio: number; 5 | } 6 | 7 | export interface EditorConfig { 8 | source: string; 9 | defaultSavedImageType: string; 10 | defaultSavedImageName: string; 11 | theme: { 12 | palette: { 13 | 'txt-primary': string; 14 | 'txt-primary-invert': string; 15 | 'txt-secondary': string; 16 | 'txt-secondary-invert': string; 17 | 'txt-placeholder': string; 18 | 'accent-primary': string; 19 | 'accent-primary-hover': string; 20 | 'accent-primary-active': string; 21 | 'accent-primary-disabled': string; 22 | 'bg-primary': string; 23 | 'bg-primary-hover': string; 24 | 'bg-primary-active': string; 25 | 'bg-primary-0-5-opacity': string; 26 | 'bg-secondary': string; 27 | 'icons-primary': string; 28 | 'icons-primary-opacity-0-6': string; 29 | 'icons-secondary': string; 30 | 'icons-placeholder': string; 31 | 'btn-primary-text': string; 32 | 'btn-disabled-text': string; 33 | 'link-primary': string; 34 | 'link-hover': string; 35 | 'link-active': string; 36 | 'borders-primary': string; 37 | 'borders-secondary': string; 38 | 'borders-strong': string; 39 | 'borders-invert': string; 40 | 'border-active-bottom': string; 41 | 'active-secondary': string; 42 | 'active-secondary-hover': string; 43 | 'active-secondary-active': string; 44 | }; 45 | typography: { 46 | fontFamily: string; 47 | }; 48 | }; 49 | annotationsCommon: { 50 | fill: string; 51 | }; 52 | Text: { 53 | text: string; 54 | fonts: Array<{ 55 | label: string; 56 | value: string; 57 | }>; 58 | }; 59 | translations: { 60 | [key: string]: string; 61 | }; 62 | Crop: { 63 | presetsItems: CropPreset[]; 64 | autoResize: boolean; 65 | }; 66 | defaultTabId: string; 67 | defaultToolId: string; 68 | observePluginContainerSize: boolean; 69 | showCanvasOnly: boolean; 70 | } 71 | -------------------------------------------------------------------------------- /src/utils/imageUtils.ts: -------------------------------------------------------------------------------- 1 | export const createDownloadLink = (imageUrl: string, filename: string): void => { 2 | const link = document.createElement('a'); 3 | link.href = imageUrl; 4 | link.download = filename; 5 | document.body.appendChild(link); 6 | link.click(); 7 | document.body.removeChild(link); 8 | }; 9 | 10 | export const validateImageFile = (file: File): void => { 11 | if (!file.type.startsWith('image/')) { 12 | throw new Error('Please select a valid image file'); 13 | } 14 | 15 | // 10MB size limit 16 | const maxSize = 10 * 1024 * 1024; 17 | if (file.size > maxSize) { 18 | throw new Error('Image size must be less than 10MB'); 19 | } 20 | 21 | const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; 22 | if (!allowedTypes.includes(file.type)) { 23 | throw new Error('Please select a JPEG, PNG, GIF, or WebP image'); 24 | } 25 | }; -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], 4 | theme: { 5 | extend: { 6 | colors: { 7 | primary: { 8 | 50: '#f5f5f5', // Lightest shade for high contrast elements 9 | 100: '#e6e6e6', // Light text 10 | 200: '#cccccc', // Muted text 11 | 300: '#999999', // Secondary text 12 | 400: '#666666', // Subtle borders 13 | 500: '#4d4d4d', // Lighter panels 14 | 600: '#2d2d2d', // Main background 15 | 700: '#262626', // Sidebar/darker panels 16 | 800: '#1f1f1f', // Deep panels 17 | 900: '#171717', // Dropdowns/modals 18 | 950: '#0a0a0a', // Deepest shade 19 | }, 20 | accent: { 21 | 400: '#2196f3', // Primary blue (buttons, selections) 22 | 500: '#1976d2', // Darker blue for hover states 23 | 600: '#1565c0', // Pressed states 24 | }, 25 | success: { 26 | 500: '#2ecc71', // Success states 27 | }, 28 | error: { 29 | 500: '#e74c3c', // Error states 30 | }, 31 | warning: { 32 | 500: '#f1c40f', // Warning indicators 33 | }, 34 | foreground: '#ffffff', // Pure white text 35 | }, 36 | textColor: { 37 | primary: '#ffffff', // Default white text 38 | secondary: '#cccccc', // Muted text 39 | accent: '#2196f3', // Interactive text 40 | }, 41 | backgroundColor: { 42 | base: '2D2D2D', // Main app background 43 | panel: '#262626', // Sidebar/panels 44 | highlight: '#4d4d4d', // Hover states 45 | }, 46 | }, 47 | }, 48 | plugins: [], 49 | }; 50 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"] 24 | } 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | import { resolve } from 'path'; 4 | 5 | export default defineConfig({ 6 | plugins: [react()], 7 | resolve: { 8 | alias: { 9 | '@': resolve(__dirname, './src'), 10 | } 11 | }, 12 | server: { 13 | host: true, 14 | port: 5173, 15 | }, 16 | }); --------------------------------------------------------------------------------