├── .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 | 
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 |

56 |
🖼️ Intuitive Editing
57 |
Easy-to-use interface for basic and advanced modifications
58 |
59 |
60 |

61 |
⚡ Fab Filters
62 |
Full of beautiful filters to make your photos stand out
63 |
64 |
65 |

66 |
🎨 Rich Tools
67 |
Crop, rotate, adjust, and more
68 |
69 |
70 |

71 |
📱 Mobile-Optimized
72 |
Fully responsive design that works on all devices
73 |
74 |
75 |

76 |
💄 Fine-tuning
77 |
Brightness, Contrast, HSV and more.
78 |
79 |
80 |

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 |

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 | });
--------------------------------------------------------------------------------